【问题标题】:Can't draw() sprites in pyglet无法在 pyglet 中绘制()精灵
【发布时间】:2016-12-05 12:30:15
【问题描述】:

由于某种原因,我无法让 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(如注释行所示)似乎工作得很好,但显然这不是我想要的功能。我想不通这个。我错过了什么?

【问题讨论】:

标签: python sprite draw pyglet blit


【解决方案1】:

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

Sprite.draw() 在内部使用v2i 格式和 VertexDomain.draw()。由于某种原因,这种组合不适用于 Windows Vista/7 Catalyst 驱动程序 11.9 及更高版本,因此 Sprite 绘图也会失败。另见:pyglet vertex list not rendered (AMD driver?)

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

您目前的选择似乎是修补 pyglet.sprite.Sprite(如 the third comment 中提到的那样)或降级您的视频驱动程序。

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

【讨论】:

    【解决方案2】:

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

    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()
    

    【讨论】:

    • 我测试了你的版本和我的版本。我的版本有效。 hextile.png 有多大?尝试将其移近原点?
    • 这是我的 png:i44.tinypic.com/2wodc7t.png 我尝试了其他一些 png,但没有得到不同的结果。 “更接近原点”是什么意思?
    • 获取您发布的代码,并将sprite = 放在您创建精灵的位置。没有其他变化。你的 .png 看起来不错。我担心它可能不在屏幕上。
    • 是的,我确实尝试过,我什至尝试过sprite = pyglet.sprite.Sprite(image, x=200, y=300, batch=batch) @game.event def on_draw(): game.clear() sprite.draw(),但无济于事。另外,我认为这种绘制东西的方式是标准的,因为它在我遇到的几乎所有教程中都使用过?
    • 这是最奇怪的。我确实将我的代码发送给了我的两个朋友,他们遇到了和我一样的问题,也许我的 pyglet 有问题?他们和我有相同的 pyglet 设置。谢谢,朋友。我会调查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多