从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 职位,除了 x 和 y 。这对于某些排序技术很有用,甚至对于在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现在有 projection 和 view 属性,它们是4x4矩阵。这两个矩阵在内部用于确定最终的屏幕投影。在pyglet 1.X中,您可能使用过OpenGL命令,如 glOrtho , glTranslate 等,以操控“相机”。或者,如果直接使用OpenGL矩阵,则 glMatrixMode , glPushMatrix , glPopMatrix 等,以操纵矩阵。在Piglet 2.0+中,您只需在窗口上直接设置矩阵即可。
例如:如果要设置透视(3D)投影而不是默认的正交(2D)投影,只需设置 Window.projection 矩阵。如果要滚动视区,只需将 Window.view 矩阵。
新的 math
模块可用于帮助创建和操作矩阵,因此无需深入的数学知识即可执行基本运算。
这里有一些关于新用法的非常简单化的例子。
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.add 和 Batch.add_indexed 已经被移除了。相反,您可以从ShaderProgram开始,并使用 ShaderProgram.vertex_list 或 ShaderProgram.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))
请参阅 着色器和渲染 部分,了解有关新界面的更多详细信息。