«слишком много значений, чтобы распаковать ошибку» при попытке создать пакет в pyglet - PullRequest
0 голосов
/ 21 декабря 2010

Я пытался заставить пакеты работать в pyglet, но меня полностью смущает сообщение об ошибке "слишком много значений для распаковки" из файла pyglet/graphics/__init__.py.Я предполагаю, что я делаю что-то неправильно синтаксически при добавлении геометрии в пакет.

Я сократил свой код до основных частей, которые создают ошибку:

from pyglet.gl import *
from pyglet.graphics import *
import pyglet

batch = pyglet.graphics.Batch()
img = pyglet.image.load('pic.png')
texture = img.get_texture()

class TextureEnableGroup(pyglet.graphics.Group):
    def set_state(self):
        glEnable(GL_TEXTURE_2D)
    def unset_state(self):
        glDisable(GL_TEXTURE_2D)

texture_enable_group = TextureEnableGroup()

class TextureBindGroup(pyglet.graphics.Group):
    def __init__(self, texture):
        super(TextureBindGroup, self).__init__(parent=texture_enable_group)
        self.texture = texture
    def set_state(self):
        glBindTexture(GL_TEXTURE_2D, self.texture.id)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
    def __eq__(self, other):
        return (self.__class__ is other.__class__ and self.texture == other.__class__)

batch.add(12, GL_TRIANGLES, TextureBindGroup(texture), (('t2f', (0, 0)), ('v3f', (64, 64, 0)), ('t2f', (1, 1)), ('v3f', (-64, -64, 205)), ('t2f', (0, 1)), ('v3f', (-64, 64, 205)), ('t2f', (1, 1)), ('v3f', (64, -64, 205)), ('t2f', (1, 0)), ('v3f', (64, 64, 0)), ('t2f', (0, 1)), ('v3f', (-64, -64, 205))))

Ответы [ 4 ]

1 голос
/ 21 декабря 2010

Ваша проблема в этой строке:

batch.add(12, GL_TRIANGLES, TextureBindGroup(texture), (('t2f', (0, 0)), ('v3f', (64, 64, 0)), ('t2f', (1, 1)), ('v3f', (-64, -64, 205)), ('t2f', (0, 1)), ('v3f', (-64, 64, 205)), ('t2f', (1, 1)), ('v3f', (64, -64, 205)), ('t2f', (1, 0)), ('v3f', (64, 64, 0)), ('t2f', (0, 1)), ('v3f', (-64, -64, 205))))

Я считаю, что это должно быть:

batch.add(12, GL_TRIANGLES, TextureBindGroup(texture), ('t2f', (0, 0)), ('v3f', (64, 64, 0)), ('t2f', (1, 1)), ('v3f', (-64, -64, 205)), ('t2f', (0, 1)), ('v3f', (-64, 64, 205)), ('t2f', (1, 1)), ('v3f', (64, -64, 205)), ('t2f', (1, 0)), ('v3f', (64, 64, 0)), ('t2f', (0, 1)), ('v3f', (-64, -64, 205)))

Обратите внимание, как я изменил последний аргумент из формата ((tuple), (tuple)) на (tuple), (tuple)). Я не знаком с pyglet, но обнаружил, что это правильный способ вызова batch.add() из документации . Обратите внимание, что *data представляет переменный список параметров в конце вызова функции, а не кортеж или список, как вы пытались.

Попробуйте и дайте нам знать, как это работает для вас.

0 голосов
/ 21 декабря 2010

Благодаря Marcog, Правильная последняя строка сценария:

batch.add(6, GL_TRIANGLES, TextureBindGroup(texture), ('v3i', (64, 64, 0, -64, -64, 205, -64, 64, 205, 64, -64, 205, 64, 64, 0, -64, -64, 205)), ('t2i', (0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1)))

т.е. проблема решена =)

Проблема была частично в том, что я отправил все данные в виде одного кортежа (на что указал Марког), а также передал неправильное значение длины пакета данных геометрии; 6 вершин вместо 12.

0 голосов
/ 21 декабря 2010

Я бы предположил, что ваш 4-й аргумент batch.add() не соответствует формату, который ожидает Pyglet. Может быть полезно проверить это.

Кроме того, просмотр строк в pyglet, где происходит ошибка, может дать вам больше информации. Возможно, это проблема с аргументами, передаваемыми в функцию pyglet.

PS: документация для add может представлять интерес.

0 голосов
/ 21 декабря 2010

«Слишком много значений для распаковки» - ошибка, которую вы получаете, когда делаете что-то вроде

a, b = "a b c".split(" ")

Разделение возвращает три значения, но вы пытаетесь соединить их в два. Я полагаю, у вас неверные скобки где-то в последней строке. Попробуйте использовать более четкий синтаксис для этого. Как сейчас, это ужасно и нечитаемо.

...