Pyglet-一次移动多个形状

问题描述

我正在制作一个 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),需要一秒钟或进行平移和缩放。有没有比这更好的方法呢?谢谢!

Here 是完整代码

解决方法

是的。使用 OpenGL 变换矩阵来应用变换。这些将在 GPU 上计算以提高性能。

pyglet.graphics.Group 允许您将此类转换组合在一起,以便在绘制它们时将它们自动应用于 Pyglet 基元。

示例

我们创建了一个 AND c.lft Between b.lft AND b.rgt 来平移和缩放对象。

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() center_xcenter_y 属性。

通过将组附加到 Pyglet 对象来应用该组。

factor

cam_group = CameraGroup(main_win) rect = pyglet.shapes.Rectangle(250,300,400,200,color=(255,22,20),batch=batch,group=cam_group) 被渲染时,组转换区域会自动应用。

如果需要,您还可以构建更复杂的组。

,

examples 文件夹中有一个用于 pyglet 的相机示例。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...