Pyglet绘图原语

2024-09-29 01:19:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个带有网格的元胞自动机,但是当我试图给单元格一个颜色时,我得到了一个错误。如果我删除"('c3B', (255,0,0))",一切正常。在

def on_draw(self):
    self.clear()
    self.predatorAndPrey.draw()

功能如下:

^{pr2}$

错误如下:

File "E:/Python/Cellular Automata/Predator and Prey/Cellular Automata.py", line 23, in on_draw
    self.predatorAndPrey.draw()
  File "E:\Python\Cellular Automata\Predator and Prey\predator_and_prey.py", line 39, in draw
    ('c3B', (255,0,0))
  File "E:\Python\Cellular Automata\venv\lib\site-packages\pyglet\graphics\__init__.py", line 230, in draw_indexed
    'Data for %s is incorrect length' % format
AssertionError: Data for c3B is incorrect length

Tags: andinpyselfon错误linefile
2条回答

由于我的评论显然是有道理的,下面就详细解释一下它为什么起作用,并举例说明如何正确使用它。在

函数draw_indexed()是一种按索引顺序绘制原语的方法。原语可以是pyglet.gl上下文支持的任何内容,在本例中是GL_QUADSGL_QUAD对象至少需要一件事,那就是所有原语四个角的cordinate。你在square_cords中提供它们,它们成对地出现在两个(X,Y) * 4角上(总共8个项)。在

或者,您可以向GL_QUAD对象提供颜色信息。这将指示渲染过程每个角点应映射到的颜色。在您的例子中,您选择了发送颜色信息。在

所有这些都基于两个方面:v2i意思是vertext信息,2每个顶点的组件(意思是2D空间),并且提供的数据是i(整数)类型。在

颜色遵循相似的含义/定义。其中c3B表示c表示颜色,3表示每个数据blob(在本例中为RGB)的3个项目,类型为B(unsigned int)。但是颜色是很难理解的,因为它与v2i中的顶点定义数量有很大关系。这意味着颜色是绑在每对(角落)在你的四方。如果它是一条线,它将被绑定到行的开始和结尾。在一个点中,它是一个单一的颜色定义,因为一个点只有一个(x,y)元素。但是它总是与原语中期望的定义数量相关联-所以再次强调-你的四边形有4个定义/角点-所以你需要4个颜色对。在

所以你需要将你的颜色定义(255, 0, 0)乘以你有角的次数。(255, 0, 0)因为您使用了3B。{/cd21>所以你有角。实现这一点的最简单方法是(255,0,0) * int(len(square_cords)/2)/2是因为在square_cords(x,y)中每个角点有2对-但是您只想计算角的数量而不是位置。我希望这有道理。在

所以,作为一个实际的例子,这里有一段代码说明了这是如何联系在一起的,希望这能教会你一些关于顶点,颜色,以及GL_***上下文对某些事物的期望。祝你好运。在

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

我从来没有用过Pyglet,但是你有没有试着给alpha加最后一个0:(255,0,0,0)? 看了一下文件,它看起来是需要的。在

相关问题 更多 >