簡體   English   中英

Pyglet - 一次移動多個形狀

[英]Pyglet- Moving many shapes at once

我正在制作一個 langton 的 ant 元胞自動機程序,我希望用戶能夠平移和縮放。 現在,我將所有矩形(網格正方形)存儲為字典,為了移動/縮放,我遍歷所有矩形並應用所需的轉換。

def zoom(self, factor, center_x, center_y):
    for x in range(WIDTH):
        for y in range(HEIGHT):
            rect =  self.rects[x][y]
            self.rects[x][y].x = (rect.x - center_x)*factor + center_x
            self.rects[x][y].y = (rect.y - center_y)*factor + center_y
            self.rects[x][y].width = rect.width * factor
            self.rects[x][y].height = rect.height * factor

但是,對於矩形的數量(32,000),它需要一秒鍾或進行平移和縮放。 還有比這更好的方法嗎? 謝謝!

是完整的代碼

是的。 使用 OpenGL 變換矩陣來應用變換。 這些將在 GPU 上計算以提高性能。

pyglet.graphics.Group允許您將此類轉換組合在一起,以便在繪制它們時將它們自動應用於 Pyglet 基元。

例子

我們創建一個將對象平移和縮放到視圖中的CameraGroup

import pyglet.gl as gl
import pyglet.shapes

class CameraGroup(Group):
    def __init__(self, window, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.win = window

    def set_state(self):
        gl.glPushMatrix()
        x = -(self.win.x - self.win.width // 2)
        y = -(self.win.y - self.win.height // 2)
        gl.glTranslatef(x, y, 0.0)
        gl.glScalef(self.win.factor, self.win.factor, 1.0)

    def unset_state(self):
        gl.glPopMatrix()

該示例假設您在 window 上具有屬性center_xcenter_yfactor

通過將組附加到 Pyglet 對象來應用組。

cam_group = CameraGroup(main_win)
rect = pyglet.shapes.Rectangle(250, 300, 400, 200, color=(255, 22, 20), batch=batch, group=cam_group)

rect被渲染時,組轉換區域會自動應用。

如果需要,您還可以構建更復雜的組。

在示例文件夾中有一個 pyglet 的相機示例。

https://github.com/pyglet/pyglet/blob/pyglet-1.5-maintenance/examples/camera.py

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM