我们将会以必不可少的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()事件被分配到窗口使它重绘它的内容。pyglet提供多种方式来让事件附加在对象上;一个简单的方法是使用修饰器:
@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()
我们调用了pyglet.resource中的image函数来加载图片。他会自动定义与应用程序同级的图片。要加载未与应用程序绑定的图片(比如,用command line指定),您可以使用pyglet.image.load().
blit()方法绘制图像。这些参数告诉 pyglet 在窗口(左下角)的像素坐标 0, 0 处绘制图像。(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()
键盘事件有两个参数:按下的按键符号,以及存在的任何修饰符的按位组合(例如,CTRL
和SHIFT
键)。
有关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 文件:
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()
example/media_player.py示例演示如何使用pyglet流式音频和视频的重放。example/noisy/noisy.py示例演示同时播放许多短的音频样本,如在游戏。
注:MP3 和其他压缩音频格式需要安装 FFmpeg。未压缩的 WAV 文件可以在没有 FFmpeg 的情况下播放。
上面的示例向您展示了如何在屏幕上显示内容,以及如何实现一些基本功能。关于这些示例,您可能还有很多问题,但别担心。本编程指南的其余部分详细介绍了许多pyglet功能的技术细节。如果您是一位经验丰富的开发人员,您可能可以直接进入您感兴趣的部分。
对于新用户来说,一次通读所有内容可能会令人生畏。如果您感到不知所措,我们建议您浏览每章的开头,然后查看更深入的示例项目。您可以在所有游戏示例部分找到 2D 游戏的示例。
要编写高级 3D 应用程序或在 2D 应用程序中实现最佳性能,您需要直接使用 OpenGL。如果您只想使用 OpenGL 基元,但想要更高级的东西,请查看Graphics模块。
examples/
在文档和源代码分发的目录中有许多pyglet应用程序的示例。如果您遇到困难或有任何疑问,请加入我们的邮寄列表或Discord!
上一章