Примитивы рисования Пиглет с цветом - PullRequest
0 голосов
/ 10 марта 2019

Я создаю клеточный автомат с сеткой, но когда я пытаюсь дать клетке цвет, я получаю сообщение об ошибке.Если я удаляю "('c3B', (255,0,0))", все работает.

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

А вот функция:

    def draw(self):
    for row in range(0, self.grid_height):
        for col in range(0, self.grid_width):
            square_cords = (
                row * self.cell_size, col * self.cell_size,
                row * self.cell_size, col * self.cell_size + self.cell_size,
                row * self.cell_size + self.cell_size, col * self.cell_size + self.cell_size,
                row * self.cell_size + self.cell_size, col * self.cell_size
            )
            if self.cells[row][col][0] == 1:

                pyglet.graphics.draw_indexed(4, pyglet.gl.GL_QUADS,
                                             [0,1,2,3],
                                             ('v2i', square_cords),
                                             ('c3B', (255,0,0))
                                             )

Вот ошибка:

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

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

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

Функция draw_indexed() - это способ рисовать примитивы в упорядоченном порядке,Примитив может быть любым, что поддерживается в контексте pyglet.gl, в данном случае GL_QUADS.Для объекта GL_QUAD требуется, по крайней мере, одна вещь, и это все четыре примитивы.Вы поставляете их в square_cords, и они поставляются парами двух (X,Y) * 4 углов (всего 8 предметов).

При желании вы можете предоставить информацию о цвете для GL_QUADобъект.Это указывает процессу рендеринга, какой цвет должен быть сопоставлен каждому углу.В вашем случае вы решили отправить информацию о цвете.

Все это основано на двух вещах: v2i означает vertext информацию, 2 компонентов на вершину (означает 2D-пространство) ипредоставленные данные имеют тип i (целое число).

Цвет соответствует аналогичному значению / определению.где c3B означает c для цвета, 3 означает 3 элемента на каждый блок данных (в данном случае RGB) и имеет тип B (unsigned int).Но цвет "хитрый" , так как он сильно связан с количеством определений вершин ранее в v2i.Это означает, что цвет привязан к каждой паре (углу) в вашем квадроцикле.Если бы это была строка, она была бы привязана к началу и концу строки.А в точке это будет одно определение цвета, поскольку точка имеет только один элемент (x,y).Но он всегда привязан к количеству определений, ожидаемых в примитиве - и снова - у вашего квадра есть 4 определения / угла - поэтому вам понадобится 4 пары цветов.

Так что вам нужно будет умножить определение цвета (255, 0, 0) столько раз, сколько у вас углов.(255, 0, 0) потому что вы использовали 3B.И у вас есть 4 угла , поэтому (255, 0, 0) * 4.Самый простой способ добиться этого - сделать (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()
0 голосов
/ 10 марта 2019

Я никогда не использовал Pyglet, но вы пытались просто добавить последние 0 для альфа: (255,0,0,0)?Читая документацию, похоже, что это необходимо.

...