编写一个pyglet应用程序
开始使用新的库或框架可能会令人望而生畏,尤其是在有大量参考资料需要阅读的情况下。这一章简单介绍了一下pyglet,但没有太多细节。
你好,世界
我们将以必要的“Hello,World”引言开始。这个程序会打开一个窗口,里面有一些文本,然后等待关闭。您可以在 examples/programming_guide/hello_world.py 文件。
首先从导入 pyglet
套餐::
import pyglet
创建 pyglet.window.Window
通过调用其默认构造函数。窗口在创建后将立即可见,并且其所有参数都将具有合理的默认值:
window = pyglet.window.Window()
要显示文本,我们将创建一个 Label
。关键字参数用于设置标签的字体、位置和锚定::
label = pyglet.text.Label('Hello, world',
font_name='Times New Roman',
font_size=36,
x=window.width//2, y=window.height//2,
anchor_x='center', anchor_y='center')
该窗口将调度一个 on_draw()
只要它准备好重新绘制其内容,就会引发。Piglet提供了几种将事件处理程序附加到对象的方法;一种简单的方法是使用修饰符::
@window.event
def on_draw():
window.clear()
label.draw()
在上述范围内 on_draw()
处理程序中,窗口将被清除为默认背景色(黑色),并绘制标签。
最后,调用::
pyglet.app.run()
这将进入pyglet的默认事件循环,并让pyglet响应鼠标和键盘等应用程序事件。现在将根据需要调用您的事件处理程序,并且 run()
方法将仅在所有应用程序窗口都已关闭时返回。
如果您来自另一个库,您可能习惯于编写自己的事件循环。这也可以用于pyglet,但通常不是必需的;请参见 应用程序事件循环 了解更多细节。
图像查看器
大多数游戏和应用程序都需要在屏幕上加载和显示图像。在本例中,我们将从应用程序的目录加载图像并将其显示在窗口中:
import pyglet
window = pyglet.window.Window()
image = pyglet.resource.image('kitten.jpg')
@window.event
def on_draw():
window.clear()
image.blit(0, 0)
pyglet.app.run()
我们使用了 image()
的功能 pyglet.resource
加载图像,这会自动定位相对于源文件(而不是工作目录)的文件。要加载未与应用程序捆绑在一起的图像(例如,在命令行上指定),您可以使用 pyglet.image.load()
。
这个 blit()
方法绘制图像。这些论据 (0, 0)
告诉pyglet在窗口(左下角)的像素坐标0,0处绘制图像。
此示例的完整代码位于 examples/programming_guide/image_viewer.py 。
处理鼠标和键盘事件
到目前为止,唯一使用的事件是 on_draw()
事件。要对键盘和鼠标事件做出反应,还需要为这些事件编写和附加事件处理程序::
import pyglet
window = pyglet.window.Window()
@window.event
def on_key_press(symbol, modifiers):
print('A key was pressed')
@window.event
def on_draw():
window.clear()
pyglet.app.run()
键盘事件有两个参数:虚拟键 symbol 这是按下的,按位组合 modifiers 存在的(例如, CTRL
和 SHIFT
密钥)。
关键符号在中定义 pyglet.window.key
**
from pyglet.window import key
@window.event
def on_key_press(symbol, modifiers):
if symbol == key.A:
print('The "A" key was pressed.')
elif symbol == key.LEFT:
print('The left arrow key was pressed.')
elif symbol == key.ENTER:
print('The enter key was pressed.')
请参阅 pyglet.window.key
有关关键符号的完整列表,请参阅文档。
鼠标事件的处理方式类似::
from pyglet.window import mouse
@window.event
def on_mouse_press(x, y, button, modifiers):
if button == mouse.LEFT:
print('The left mouse button was pressed.')
这个 x
和 y
参数提供按下按钮时鼠标相对于窗口左下角的位置。
您可以在一个窗口上处理20多种事件类型。查找所需事件名称和参数的一种简单方法是在程序中添加以下行:
event_logger = pyglet.window.event.WindowEventLogger()
window.push_handlers(event_logger)
这将导致在窗口上接收的所有事件都被打印到控制台。
使用键盘和鼠标事件的示例程序在 examples/programming_guide/events.py
播放声音和音乐
pyglet使播放和混合多种声音变得很容易。下面的示例播放一个MP3文件 [1]:
import pyglet
music = pyglet.resource.media('music.mp3')
music.play()
pyglet.app.run()
与前面给出的图像加载示例一样, media()
在应用程序的目录(而不是工作目录)中找到声音文件。如果您知道实际的文件系统路径(相对或绝对),请使用 pyglet.media.load()
。
默认情况下,播放时会播放音频。这对较长的音乐曲目很有效。短小的声音,如游戏中使用的枪声,应该在使用之前在内存中完全解码。这使得他们可以更快地玩游戏,并减少对CPU性能的影响。它还允许重复播放相同的声音,而无需重新加载。指定 streaming=False
在这种情况下::
sound = pyglet.resource.media('shot.wav', streaming=False)
sound.play()
这个 examples/media_player.py 示例演示了使用pyglet播放流音频和视频流。这个 examples/noisy/noisy.py 示例演示了如何像在游戏中一样同时播放多个简短的音频样本。
下一步去哪里?
上面的例子已经向您展示了如何在屏幕上显示一些内容,以及如何执行一些基本任务。关于这些示例,您可能会有很多问题,但不要担心。本编程指南的其余部分将更详细地介绍Pyglet的许多特性。如果您是一位经验丰富的开发人员,您可能会直接进入您感兴趣的部分。
对于新用户来说,一次通读所有内容可能会让人望而生畏。如果你感到不知所措,我们建议浏览每一章的开头,然后看看更深入的示例项目。你可以在这里找到一个2D游戏的例子 深度游戏示例 一节。
要编写高级3D应用程序或在2D应用程序中实现最佳性能,您也可以直接使用OpenGL。Pyglet提供原始的OpenGL绑定,使您可以直接访问OpenGL库,这确实需要了解 ctypes 有效地使用。为了使事情简单一点, graphics 模块为最常见的OpenGL构造提供更高级别的对象。这个 着色器和渲染 部分将更详细地介绍。
中有许多pyglet应用程序的示例 examples/
文档和源代码分发的目录。如果你被困住了,或者有任何问题,请加入我们的 mailing list 或 Discord 好了!