Невозможно рисовать () спрайты в пиглете

Почему-то не получается заставить пиглет рисовать спрайты. Вот мой код:

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

Теперь, когда я рисую пакет, текстовая метка отображается правильно. Я вижу "ДИНГ" в окне. Однако изображение "hextile.png" не отображается. Я попытался нарисовать спрайт самостоятельно, но это тоже не сработало. Однако копирование изображения (как показано в закомментированной строке), похоже, работает нормально, но, очевидно, это не совсем та функциональность, которую я здесь ищу. Я не могу понять этого. Что мне не хватает?


person SnowFatal    schedule 13.03.2012    source источник
comment
У вас случайно есть видеокарта ATI / AMD? Может быть связано с этим: stackoverflow .com / questions / 9369357 / Смотрите и мой комментарий там.   -  person Eric    schedule 21.03.2012


Ответы (2)


Предположим, у вас и ваших друзей есть видеокарты ATI:

Sprite.draw () внутренне использует формат v2i и VertexDomain.draw (). По какой-то причине эта комбинация не работает с драйверами Catalyst для Windows Vista / 7 11.9 и выше, и, следовательно, рисование Sprite также не выполняется. См. Также: список вершин пиглета не отображается (драйвер AMD?)

Существует проблема с pyglet, которой вы, возможно, захотите следовать: http://code.google.com/p/pyglet/issues/detail?id=544.

На данный момент у вас есть варианты, чтобы исправить pyglet.sprite.Sprite, как указано в третий комментарий по этой проблеме или понизьте версию своего видеодрайвера.

Обновление: не нужно исправлять Sprite или понижать версию видеодрайвера. Эта проблема, похоже, решена в Catalyst 12.4 (видеодрайвер 8.961.0.0).

person Eric    schedule 21.03.2012

Спрайт собирает мусор, потому что у вас нет на него ссылки. Сделай это:

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()
person FogleBird    schedule 14.03.2012
comment
Я тестировал вашу версию и свою версию. Моя версия сработала. Насколько велик hextile.png? Попробовать переместить его ближе к началу координат? - person FogleBird; 14.03.2012
comment
Вот мой png: i44.tinypic.com/2wodc7t.png Я пробовал с несколькими другими png , и я не получил других результатов. Что вы имеете в виду, говоря о приближении к происхождению? - person SnowFatal; 14.03.2012
comment
Возьмите опубликованный вами код и поместите sprite = там, где вы создаете свой спрайт. Других изменений нет. Ваш .png выглядит нормально. Я был обеспокоен тем, что это могло быть за пределами экрана. - person FogleBird; 14.03.2012
comment
Да, я пробовал это, я даже пробовал sprite = pyglet.sprite.Sprite(image, x=200, y=300, batch=batch) @game.event def on_draw(): game.clear() sprite.draw() безуспешно. Кроме того, я думал, что этот способ рисования был стандартом, поскольку он используется практически во всех учебных пособиях, с которыми я сталкивался? - person SnowFatal; 14.03.2012
comment
Это очень странно. Я отправил свой код двум своим друзьям, и у них возникла такая же проблема, как и у меня, возможно, что-то не так с моим пиглетом? У них была такая же установка пиглета, как у меня. Спасибо, друг. Я займусь этим. - person SnowFatal; 14.03.2012
comment
Я использую Python 2.7.2 и Pyglet 1.1.4 - person FogleBird; 14.03.2012
comment
То же самое. Работает на 64-битной Windows 7. Я еще разберусь в этом вопросе. - person SnowFatal; 14.03.2012
comment
Как ни странно, это тоже не работает. Я только что переустановил pyglet и дважды проверил свою версию Python, поэтому я уверен, что мои библиотеки в порядке. Я действительно в растерянности. Я искренне признателен за вашу помощь. Я попробую ваш код завтра в школе и посмотрю, как он пойдет. - person SnowFatal; 14.03.2012