4

出于某种原因,我无法让 pyglet 绘制精灵。这是我的代码:

import pyglet

game = pyglet.window.Window(640, 480, "I'm a window")

batch = pyglet.graphics.Batch()

pyglet.resource.path = ["."]
pyglet.resource.reindex()

image = pyglet.resource.image("hextile.png")
pyglet.sprite.Sprite(image, x=200, y=300, batch=batch)
pyglet.text.Label('DING', font_name='Arial', font_size=24, x=100, y=100, batch=batch)

@game.event
def on_draw():

    game.clear()
    batch.draw()
    #image.blit(0, 0)

pyglet.app.run()

现在,当我绘制批次时,文本标签显示正确。我在窗户上看到“DING”。但是,未显示图像“hextile.png”。我尝试独立绘制精灵,但这也不起作用。然而,对图像进行 Blitting(如注释行所示)似乎工作得很好,但显然这不是我想要的功能。我想不通这个。我错过了什么?

4

2 回答 2

5

假设你和你的朋友有 ATI 显卡:

Sprite.draw() 在内部使用v2i格式和 VertexDomain.draw()。由于某种原因,这种组合不适用于 Windows Vista/7 Catalyst 驱动程序 11.9 及更高版本,因此 Sprite 绘图也会失败。另请参阅:未呈现 pyglet 顶点列表(AMD 驱动程序?)

您可能需要关注一个 pyglet 问题:http ://code.google.com/p/pyglet/issues/detail?id=544

您目前的选择似乎是修补 pyglet.sprite.Sprite (如关于该问题的第三条评论中所述)或降级您的视频驱动程序。

更新:无需修补 Sprite 或降级您的视频驱动程序。Catalyst 12.4(视频驱动程序 8.961.0.0)似乎解决了这个问题。

于 2012-03-21T15:47:26.363 回答
1

精灵正在收集垃圾,因为您没有对它的引用。做这个:

sprite = pyglet.sprite.Sprite(image, x=200, y=300, batch=batch)

对于它的价值,我更喜欢使用 Window 的子类,如下所示:(此代码也适用于我)

import pyglet

class Window(pyglet.window.Window):
    def __init__(self, *args, **kwargs):
        super(Window, self).__init__(*args, **kwargs)
        self.batch = pyglet.graphics.Batch()
        image = pyglet.resource.image('hextile.png')
        self.sprite = pyglet.sprite.Sprite(image, batch=self.batch)
    def on_draw(self):
        self.clear()
        self.batch.draw()

def main():
    window = Window(width=640, height=480, caption='Pyglet')
    pyglet.app.run()

if __name__ == '__main__':
    main()
于 2012-03-14T00:04:04.397 回答