Поскольку мой комментарий, очевидно, имел смысл, вот подробное объяснение того, почему он работает, с примером того, как правильно его использовать.
Функция 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()