如何安装 pygame 并创建模板,以便用 Python 3 开发游戏

介绍

pygame图书馆是专门为您制作游戏和其他多媒体应用程序而设计的 Python 编程语言的开源模块,基于高度便携的 SDL (Simple DirectMedia Layer) 开发图书馆,pygame 可以在许多平台和操作系统上运行。

通过使用pygame模块,您可以控制游戏的逻辑和图形,而不必担心工作与视频和音频所需的后端复杂性。

本教程将首先通过将pygame安装到您的Python编程环境中,然后通过创建一个模板来开发使用pygame和Python 3的游戏。

前提条件

要使用本教程,请确保您已在 本地计算机服务器上安装了 Python 3 和编程环境。

您还应该熟悉以下Python编程概念:

有了设置的编程环境和熟悉的Python编程(https://www.digitalocean.com/community/tutorial_series/how-to-code-in-python-3),你已经准备好开始使用pygame。

安装Pygame

让我们从启用我们的Python 3编程环境开始:

1. my_env/bin/activate

有了这个激活,你可以安装Pygame与Pip:

1pip install pygame

一旦运行此命令,您应该看到类似于以下的输出:

1[secondary_label Output]
2Collecting pygame
3  Using cached pygame-1.9.3-cp35-cp35m-manylinux1_x86_64.whl
4Installing collected packages: pygame
5Successfully installed pygame-1.9.3

如果你已经安装了pygame在一个系统中,有可用的视频和音频,你可以通过运行以下命令来验证你的安装,这将运行一个模仿游戏,展示pygame可以用图形和声音做什么:

1python -m pygame.examples.aliens

如果您宁愿不打开样本,或者如果您没有 AV 作为设置的一部分,您也可以进入 Python 交互式控制台,以确保您可以导入 pygame 模块。

1python

然后在控制台中,您可以导入模块:

1import pygame

如果您在按下ENTER键之后没有收到任何错误,您将知道 pygame 已成功安装,您可以使用quit()命令离开 Python 交互控制台。

如果您在命令行安装时遇到问题,您可以查看 pygame 的 GettingStarted wiki

在以后的步骤中,我们将假设使用监视器来显示图形用户界面作为本教程的一部分,以验证我们的代码。

导入Pygame

要了解pygame,让我们创建一个名为our_game.py的文件,我们可以使用纳米文本编辑器创建它,例如:

1nano our_game.py

当您在 pygame 中启动一个项目时,您将开始使用用于 [导入模块] 的导入语句(https://andsky.com/tech/tutorials/how-to-import-modules-in-python-3),您可以将其添加到文件的顶部:

1[label our_game.py]
2import pygame

我们还可以选择在第一行下方添加另一个导入声明,以便在您的文件的 global namespace中添加一些pygame的常数和函数:

1[label our_game.py]
2import pygame
3from pygame.locals import *

随着pygame被导入到我们的程序文件中,我们已经准备好使用它来创建一个游戏模板。

初始化Pygame

从这里,我们将用init()函数初始化pygame的功能,即初始化

1[label our_game.py]
2import pygame
3from pygame.locals import *
4
5pygame.init()

init()函数将自动启动您需要初始化的所有pygame模块。

您还可以单独初始化Pygame的每个模块,如下:

1pygame.font.init()

init()函数会向您返回一个 tuple 如果您愿意,这个 tuple 会显示成功和失败的初始化。我们可以为一般的 init() 调用和特定模块的初始化做这件事(这会告诉我们这些模块是否可用):

1i = pygame.init()
2print(i)
3
4f = pygame.font.init()
5print(f)

如果我们运行上述代码,我们将收到类似于以下的输出:

1[secondary_label Output]
2(6, 0)
3None

在这种情况下,‘i’ 变量返回了tuple (6, 0),这表明有6个成功的pygame初始化和0个失败。

设置显示表面

从这里开始,我们需要设置我们的游戏显示表面。我们将使用pygame.display.set_mode()来初始化显示窗口或屏幕,并将其传输到变量中。

1[label our_game.py]
2import pygame
3from pygame.locals import *
4
5pygame.init()
6
7game_display = pygame.display.set_mode((800, 600))

我们将tuple (800, 600)作为对 set_mode()函数的参数,代表宽度(800 px)和高度(600 px)的分辨率。

您可能会经常使用整数用于游戏的分辨率,所以您可能希望将这些数字分配给变量,而不是一次又一次地使用这些数字。

我们将使用变量display_width为我们游戏的显示宽度,和display_height为高度,并将这些变量传递到set_mode()函数:

 1[label our_game.py]
 2import pygame
 3from pygame.locals import *
 4
 5pygame.init()
 6
 7display_width = 800
 8display_height = 600
 9
10game_display = pygame.display.set_mode((display_width, display_height))

在此时,游戏显示表面设置为其宽度和高度的分辨率。

更新显示器

接下来,我们需要使用两个可用的功能之一来更新游戏表面的显示。

动画通常是不同框架之间随着时间的推移而发生的变化。当你考虑动画时,你可能会想到一本 flip book,因为它们由一系列图像组成,这些图像从一个页面到另一个页面逐步变化。

由于翻转页面或框架的概念,可以用来更新游戏表面显示的功能之一被称为flip(),并可以在上面的文件中称之为:

1pygame.display.flip()

Flip() 函数将整个显示表面更新到屏幕上。

更常见的是,使用更新()函数而不是flip()函数,因为它只会更新屏幕的部分,而不是整个区域,节省内存。

让我们将更新()函数添加到our_game.py文件的底部:

 1[label our_game.py]
 2import pygame
 3from pygame.locals import *
 4
 5pygame.init()
 6
 7display_width = 800
 8display_height = 600
 9
10game_display = pygame.display.set_mode((display_width, display_height))
11
12pygame.display.update()

在此时,你可以运行程序没有任何错误,但显示表面只会打开和快速关闭。

创建游戏环节

随着pygame被导入和初始化,显示组和游戏表面被更新,我们可以开始工作我们的主要游戏循环。

我们将创建一个(‘while’ loop)(https://andsky.com/tech/tutorials/how-to-construct-while-loops-in-python-3),它将运行游戏,循环将称之为(Boolean)(https://andsky.com/tech/tutorials/understanding-boolean-logic-in-python-3)值为True,这意味着循环将永远循环,除非它被打破。

在我们程序的这个主要游戏循环中,我们将构建一个 for 循环来迭代事件排列中的用户事件,该循环将由 pygame.event.get() 函数调用。

在此时,我们在for循环中没有任何东西,但我们可以添加一个print()陈述来显示代码的行为正如我们预期的那样。

让我们将这两个循环和‘print()’语句添加到我们的程序文件中:

 1[label our_game.py]
 2import pygame
 3from pygame.locals import *
 4
 5pygame.init()
 6
 7display_width = 800
 8display_height = 600
 9
10game_display = pygame.display.set_mode((display_width, display_height))
11
12pygame.display.update()
13
14while True:
15    for event in pygame.event.get():
16        print(event)

为了确保我们的代码工作,让我们运行该程序:

1python our_game.py

当我们运行文件时,将出现一个800x600窗口. 要测试事件,您可以鼠标穿过窗口,点击窗口,并在键盘上按下键。

您收到的输出将看起来像这样:

1[secondary_label Output]
2<Event(4-MouseMotion {'rel': (616, 355), 'buttons': (0, 0, 0), 'pos': (616, 355)})>
3<Event(5-MouseButtonDown {'button': 1, 'pos': (616, 355)})>
4<Event(6-MouseButtonUp {'button': 1, 'pos': (616, 355)})>
5<Event(2-KeyDown {'scancode': 3, 'key': 102, 'unicode': 'f', 'mod': 0})>
6<Event(3-KeyUp {'scancode': 3, 'key': 102, 'mod': 0})>
7...

此输出显示正在发生的用户事件 这些事件将控制游戏,因为它们是由用户生成的。

通过在终端窗口中按CTRL +C来阻止程序的运行。

在此时刻,您可以删除或(https://andsky.com/tech/tutorials/how-to-write-comments-in-python-3)删除print()声明,因为我们不需要所有这个终端输出。

从这里开始,我们可以通过学习如何停止游戏来完成我们的模板。

离开

要退出一个pygame程序,我们可以先退出相关模块,然后像往常一样退出Python。

pygame.quit()函数将取消所有pygame模块的初始化,Python的quit()函数将退出程序。

由于用户控制了游戏的功能和事件,我们还应该知道,当用户通过点击游戏窗口上角的X来要求该程序关闭时,pygame.QUIT会被发送到事件排队。

让我们开始控制程序的流程,在事件处理循环中使用一个 条件如果声明:

 1[label our_game.py]
 2import pygame
 3from pygame.locals import *
 4
 5pygame.init()
 6
 7display_width = 800
 8display_height = 600
 9
10game_display = pygame.display.set_mode((display_width, display_height))
11
12pygame.display.update()
13
14while True:
15    for event in pygame.event.get():
16        if event.type == QUIT:
17            pygame.quit()
18            quit()

在上面的代码中,我们说,如果用户要求该程序关闭,该程序应该用pygame.quit()解开pygame模块,然后用quit()退出程序。

由于我们已经导入了pygame.locals,我们可以提到event.typeQUIT as-is(而不是pygame.在这些前面)。

虽然用户可能知道在游戏窗口的顶部角落点击X,但我们可能希望某些其他用户事件引发退出程序的请求。

KEYDOWN事件意味着用户正在按下键盘上的一个键。为了我们的目的,让我们假设Q键(如QUIT)或ESC键可以离开程序。

 1[label our_game.py]
 2import pygame
 3from pygame.locals import *
 4
 5pygame.init()
 6
 7display_width = 800
 8display_height = 600
 9
10game_display = pygame.display.set_mode((display_width, display_height))
11
12pygame.display.update()
13
14while True:
15    for event in pygame.event.get():
16        if event.type == QUIT or (
17             event.type == KEYDOWN and (
18              event.key == K_ESCAPE or
19              event.key == K_q
20             )):
21            pygame.quit()
22            quit()

我们添加了 Boolean 逻辑运算符(LINK0),以便如果用户在游戏窗口的顶部点击X,或者如果用户按下一个键,这要么是逃离键,要么是Q键(请注意,这不是案例敏感)。

在此时,如果您使用python our_game.py命令运行该程序,您将能够通过使用X图标离开窗口或按QESC键来测试运行游戏的功能,然后停止。

代码改进和下一步

虽然上述程序是完全功能的,但我们可以做一些事情来改进代码。

首先,我们可以将位于循环中的代码放入一个 函数定义:

1def event_handler():
2    for event in pygame.event.get():
3        if event.type == QUIT or (
4             event.type == KEYDOWN and (
5              event.key == K_ESCAPE or
6              event.key == K_q
7             )):
8            pygame.quit()
9            quit()

这将使同时循环变得稍微清洁和凝聚,特别是当我们为我们的游戏添加更多的功能时。

此外,为了开始让游戏更加磨练,我们可以在窗口的标题栏中添加一个标题(目前读到金刚石窗口)。

1pygame.display.set_caption('Our Game')

我们可以将字符串我们的游戏设置为我们想要称之为游戏的任何东西。

此外,我们可以将pygame.display.update()函数移动到主游戏循环中。

现在,我们的完整代码看起来像这样:

 1[label our_game.py]
 2import pygame
 3from pygame.locals import *
 4
 5pygame.init()
 6
 7display_width = 800
 8display_height = 600
 9
10game_display = pygame.display.set_mode((display_width, display_height))
11pygame.display.set_caption('Our Game')
12
13def event_handler():
14    for event in pygame.event.get():
15        if event.type == QUIT or (
16             event.type == KEYDOWN and (
17              event.key == K_ESCAPE or
18              event.key == K_q
19             )):
20            pygame.quit()
21            quit()
22
23while True:
24    event_handler()
25
26    pygame.display.update()

您还可以考虑不同的方法来接近上述代码,包括使用 break 声明在进入游戏输出之前退出循环。

从这里,你会想继续学习如何通过绘图和冲刺显示图像,动画图像和控制率等等。

结论

本教程向您介绍了如何将开源模块pygame安装到您的Python 3编程环境中,以及如何通过设置您可以用于控制Python游戏的主要循环的模板来开始接近游戏开发。

要做其他使用 Python 模块的编程项目,您可以学习如何使用 Tweepy 库创建 Twitterbot(https://andsky.com/tech/tutorials/how-to-create-a-twitterbot-with-python-3-and-the-tweepy-library)`如何使用 matplotlib 编写数据(https://andsky.com/tech/tutorials/how-to-plot-data-in-python-3-using-matplotlib)

Published At
Categories with 技术
comments powered by Disqus