2010-12-20 63 views
0

我一直在试图获得批次pyglet工作,但我完全被错误信息混淆“值过多解压”从未来pyglet/graphics/__init__.py文件。我的猜测是,当将几何图形添加到批处理时,我在按照语法做出错误。“值过多解压错误”当试图创建pyglet一批

我我的代码削减到会产生错误的关键部分:

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

回答

0

由于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))) 

即问题解决=)

问题是部分地,我发送的所有数据作为一个单一的元组(它marcog指出),以及传递一批数字数据的错误值; 6个顶点,而不是12

0

“太多值解压”是当你不喜欢的东西

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

的你得到一个错误分割返回三个值,但您尝试将它们粘贴到两个值。 我想你在最后一行的某处出现了一个括号。尝试使用一些更清晰的语法。因为它现在是非常可怕和不可读的。

+0

我想通了这一点使用谷歌,但rpoblem是某处pyglet Python文件内发生的错误。所以我想我没有以这种或那种方式正确使用batch.add()函数。问题在于;我应该如何使用它? – Bartvbl 2010-12-20 22:49:31

+0

你需要阅读pyglet文档。你确定你在喂食什么?语法*是*不可读的。如何使用一些变量呢? – 2010-12-20 22:53:40

0

我猜想,你的第四个参数来batch.add()并不意味着pyglet期望的格式。检查这个可能很有用。

而且,看着发生错误可以给你更多的信息,pyglet行。问题可能是您传递给pyglet函数的参数的问题。

PS:在documentationadd可能会感兴趣。

1

您的问题是在这条线:

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,但发现这是从documentation调用batch.add()的正确方法。请注意,*data代表函数调用结束时的变量列表,而不是您尝试的元组或列表。

试一下,让我们知道它是如何工作的你。

+0

是的。这解决了部分问题:) 唯一的问题是我有一个包含点和纹理坐标的数组。你知道我可以如何将它们传递给这个函数吗?python会给出某种方式让它把你传入的数组作为参数输入吗? – Bartvbl 2010-12-20 23:23:36

+0

@Bartvbl By array你是指numpy数组还是Python列表? – marcog 2010-12-20 23:28:37

+0

python列表。 (对不起;我还没有完全习惯于python术语) – Bartvbl 2010-12-20 23:34:23