<p>由于我的评论显然是有道理的,下面就详细解释一下它为什么起作用,并举例说明如何正确使用它。在</p>
<p>函数<code>draw_indexed()</code>是一种按索引顺序绘制原语的方法。原语可以是<code>pyglet.gl</code>上下文支持的任何内容,在本例中是<code>GL_QUADS</code>。<code>GL_QUAD</code>对象至少需要一件事,那就是所有原语四个角的cordinate。你在<code>square_cords</code>中提供它们,它们成对地出现在两个<code>(X,Y) * 4</code>角上(总共<strong>8个</strong>项)。在</p>
<p>或者,您可以向<code>GL_QUAD</code>对象提供颜色信息。这将指示渲染过程每个角点应映射到的颜色。在您的例子中,您选择了发送颜色信息。在</p>
<p>所有这些都基于两个方面:<code>v2i</code>意思是<code>vertext</code>信息,<code>2</code>每个顶点的组件(意思是2D空间),并且提供的数据是<code>i</code>(整数)类型。在</p>
<p>颜色遵循相似的含义/定义。其中<code>c3B</code>表示<code>c</code>表示颜色,<code>3</code>表示每个数据blob(在本例中为RGB)的3个项目,类型为<code>B</code>(unsigned int)。但是颜色是很难理解的,因为它与<code>v2i</code>中的顶点定义数量有很大关系。这意味着颜色是绑在每对(角落)在你的四方。如果它是一条线,它将被绑定到行的开始和结尾。在一个点中,它是一个单一的颜色定义,因为一个点只有一个<code>(x,y)</code>元素。但是它总是与原语中期望的定义数量相关联-所以再次强调-你的四边形有4个定义/角点-所以你需要4个颜色对。在</p>
<p>所以你需要将你的颜色定义<code>(255, 0, 0)</code>乘以你有角的次数。<code>(255, 0, 0)</code>因为您使用了<code>3B</code>。{/cd21>所以你有角。实现这一点的最简单方法是<code>(255,0,0) * int(len(square_cords)/2)</code>。<code>/2</code>是因为在<code>square_cords</code>(x,y)中每个角点有2对-但是您只想计算角的数量而不是位置。我希望这有道理。在</p>
<p>所以,作为一个实际的例子,这里有一段代码说明了这是如何联系在一起的,希望这能教会你一些关于顶点,颜色,以及<code>GL_***</code>上下文对某些事物的期望。祝你好运。在</p>
<pre><code>from pyglet import *
from pyglet.gl import *
key = pyglet.window.key
class main(pyglet.window.Window):
def __init__ (self, width=800, height=600, fps=False, *args, **kwargs):
super(main, self).__init__(width, height, *args, **kwargs)
self.x, self.y = 0, 0
self.keys = {}
self.mouse_x = 0
self.mouse_y = 0
self.cell_size = 20
self.alive = 1
def on_draw(self):
self.render()
def on_close(self):
self.alive = 0
def on_mouse_motion(self, x, y, dx, dy):
self.mouse_x = x
def on_key_release(self, symbol, modifiers):
try:
del self.keys[symbol]
except:
pass
def on_key_press(self, symbol, modifiers):
if symbol == key.ESCAPE: # [ESC]
self.alive = 0
self.keys[symbol] = True
def render(self):
self.clear()
square_cords = (
self.cell_size, self.cell_size,
self.cell_size, self.cell_size + self.cell_size,
self.cell_size + self.cell_size, self.cell_size + self.cell_size,
self.cell_size + self.cell_size, self.cell_size
)
color_pairs = (255,0,0) * int(len(square_cords)/2)
pyglet.graphics.draw_indexed(4, pyglet.gl.GL_QUADS,
[0,1,2,3],
('v2i', square_cords),
('c3B', color_pairs)
)
self.flip()
def run(self):
while self.alive == 1:
self.render()
# -> This is key <
# This is what replaces pyglet.app.run()
# but is required for the GUI to not freeze
#
event = self.dispatch_events()
if __name__ == '__main__':
x = main()
x.run()
</code></pre>