2010-12-20 41 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