编写一个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 存在的(例如, CTRLSHIFT 密钥)。

关键符号在中定义 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.')

这个 xy 参数提供按下按钮时鼠标相对于窗口左下角的位置。

您可以在一个窗口上处理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 listDiscord 好了!