从pyglet1.5迁移

Pyglet 2.0包括许多突破性的更改,因此可能需要一些工作来升级您的应用程序或游戏。最主要的是,pyglet2.0现在是围绕现代OpenGL(3.3+)构建的,而以前的版本使用传统的OpenGL 2.0上下文。虽然内部发生了很大变化,但面向用户的API基本保持不变。这意味着,如果您的程序不直接使用太多OpenGL,迁移到pyglet 2.0将会相当容易。如果您的程序 does 大量使用OpenGL,那么所有与OpenGL程序现代化相关的警告都将适用。

除了变化之外,Piglet 2.0还包括了相当多的不错的改进。对于游戏,新的控制器API改进了用户输入。这是对操纵杆API的现代赞美,特别是针对游戏控制器。在内部,已经做了大量工作来改进平台抽象。一种新的 pyglet.math 还添加了模块,该模块为常见的向量和矩阵类型提供内置支持。

Piglet 2.0应该同样易于使用,但由于现代OpenGL高度可编程的性质,它将允许更多的灵活性。

如果您维护的项目依赖于pyglet,并且无法立即更新,则可能需要固定您的pyglet版本(在requirements s.txt或setup.py中)::

pyglet<2

大体变化

如果您的程序只使用pyglet的高级对象(Sprite、Text、Shape),那么只需要做很少的事情。以下各节介绍了最显著的变化。

精灵和标签

精灵和标签现在有一个 z 职位,除了 xy 。这对于某些排序技术很有用,甚至对于在3D背景上定位2D精灵这样的高级用途也很有用。如果您正在使用 position 属性,请确保考虑到附加的 z 值(如果不需要,则保留为0)::

sprx, spry, sprz = my_sprite.position
my_sprite.position = 10, 10, 0

群组

OrderedGroup 已被移除。相反,所有组现在都有一个 order 参数。您可以通过使用Order参数创建一个Group实例来模拟该行为::

from pyglet.graphics import Group

bg_group = Group(order=0)
fg_group = Group(order=1)

窗户投影和照相机

Windows现在有 projectionview 属性,它们是4x4矩阵。这两个矩阵在内部用于确定最终的屏幕投影。在pyglet 1.X中,您可能使用过OpenGL命令,如 glOrthoglTranslate 等,以操控“相机”。或者,如果直接使用OpenGL矩阵,则 glMatrixModeglPushMatrixglPopMatrix 等,以操纵矩阵。在Piglet 2.0+中,您只需在窗口上直接设置矩阵即可。

例如:如果要设置透视(3D)投影而不是默认的正交(2D)投影,只需设置 Window.projection 矩阵。如果要滚动视区,只需将 Window.view 矩阵。

新的 math 模块可用于帮助创建和操作矩阵,因此无需深入的数学知识即可执行基本运算。

这里有一些关于新用法的非常简单化的例子。

小矮人1.5->2.0图表

1.5代码

2.0代码

翻译

glTranslatef(x, y, z)
window.view = window.view.translate((x, y, z))

结垢

glScalef(zoom, zoom, 1)
window.view = window.view.scale((zoom, zoom, 1))

正交投影

gl.glMatrixMode(gl.GL_PROJECTION)
gl.glLoadIdentity()
gl.glOrtho(0, width, 0, height, -255, 255)
gl.glMatrixMode(gl.GL_MODELVIEW)
from pyglet.math import Mat4
window.projection = Mat4.orthogonal_projection(
    0, width, 0, height, -255, 255
)

GL_QUADS

vertex_list = batch.add(4, GL_QUADS, group, vertex_format,
     ('c4B', (255,255,255,255) * 4),
     ('t3f', texture.tex_coords))
vertex_list = program.vertex_list_indexed(
 4, GL_TRIANGLES, [0, 1, 2, 0, 2, 3], batch, group,
 colors=('Bn', (255, 255, 255, 255) * 4),
 tex_coords=('f', texture.tex_coords))

应用程序事件循环

在以前的版本中,窗口被重绘(并且 Window.on_draw() 事件调度)调用任何调度函数或调度事件。这通常会导致不可预测性和潜在的帧速率不稳定。在pyglet2.0中,一个新的 interval 参数已添加到 pyglet.app.run 。现在,窗口将始终以此间隔重新绘制。默认为60fps(1/60),但可以根据需要进行设置:

@mywindow.event
def on_draw():
    # always called at 120fps

pyglet.app.run(interval=1/120)

图形模块

在Piglet 2.0中,用户面临的最大变化是 graphics 模块(另请参阅 着色器和渲染 )。如果您使用此模块绘制简单的形状和OpenGL基元, shapes 模块可能能够满足这一需求。如果您的需求更高级,请继续阅读。

在传统的OpenGL中,固定函数管道具有预定义的顶点属性。(顶点、颜色、法线、纹理坐标等)因为这些都是预定义的,所以可以直接创建Vertex List,或者使用 Batch.add(...) 来定义一个。在现代OpenGL中,情况不再是这样。由于其高度可编程的性质,没有任何东西是预先定义的。相反,属性名称、大小等都是在Shader程序中定义的。着色器可以根据需要复杂或简单,只定义必要的属性。例如,精灵和图形等pyglet对象都有自己的自定义着色器,并具有适合它们的属性。

基于上述原因, Batch.addBatch.add_indexed 已经被移除了。相反,您可以从ShaderProgram开始,并使用 ShaderProgram.vertex_listShaderProgram.vertex_list_indexed 方法:研究方法。生成的顶点列表仍然可以进行批处理,但您可以将批处理实例作为参数传递(与创建Sprite或其他对象时使用的方式相同)。

在传统的pyglet版本中,您将执行如下操作::

vertex_list = batch.add(4, GL_TRIANGLES, group,
                        ('v3f', vertex_positions),
                        ('t3f', tex.tex_coords))

在pyglet 2+中,您从ShaderProgram开始,语法略有变化::

vertex_list = shader_program.vertex_list(4, GL_TRIANGLES, batch, group,
                                         position=('f', vertex_positions),
                                         tex_coords=('f', tex.tex_coords))

请参阅 着色器和渲染 部分,了解有关新界面的更多详细信息。