如何安装pygame并创建用于在Python3中开发游戏的模板
介绍
pygame 库是 Python 编程语言的开源模块,专门用于帮助您制作游戏和其他多媒体应用程序。 pygame 建立在高度可移植的 SDL(简单 DirectMedia 层)开发库之上,可以跨多种平台和操作系统运行。
通过使用 pygame 模块,您可以控制游戏的逻辑和图形,而无需担心处理视频和音频所需的后端复杂性。
本教程将首先介绍将 pygame 安装到您的 Python 编程环境中,然后引导您创建模板以使用 pygame 和 Python 3 开发游戏。
先决条件
为了能够使用本教程,请确保您的 本地计算机 或 服务器 上已经安装了 Python 3 和编程环境。
您还应该熟悉以下 Python 编程概念:
设置好编程环境并熟悉 Python 编程 后,您就可以开始使用 pygame 了。
安装 pygame
让我们从激活我们的 Python 3 编程环境开始:
. my_env/bin/activate
激活后,您可以使用 pip 安装 pygame:
pip install pygame
运行此命令后,您应该会看到类似于以下内容的输出:
OutputCollecting pygame Using cached pygame-1.9.3-cp35-cp35m-manylinux1_x86_64.whl Installing collected packages: pygame Successfully installed pygame-1.9.3
如果您已将 pygame 安装到具有可用视频和音频的系统中,则可以通过运行以下命令来验证您的安装,该命令将运行一个模拟游戏,展示 pygame 可以对图形和声音做什么:
python -m pygame.examples.aliens
如果您不想打开示例,或者您的设置中没有 AV,您还可以进入 Python 交互式控制台以确保您可以导入 pygame 模块。 首先,输入 python
命令启动控制台:
python
然后在控制台中,您可以导入模块:
import pygame
如果在命令后按 ENTER
键时没有收到错误,您将知道 pygame 已成功安装。 您可以使用 quit()
命令退出 Python 交互式控制台。
如果您在命令行安装时遇到问题,可以查看 pygame 的 [GettingStarted wiki](http://pygame.org/wiki/GettingStarted#Pygame 安装)。
在后面的步骤中,我们将假设使用监视器来显示图形用户界面,作为本教程的一部分来验证我们的代码。
导入 pygame
为了熟悉 pygame,让我们创建一个名为 our_game.py
的文件,我们可以使用 nano 文本编辑器创建它,例如:
nano our_game.py
在 pygame 中开始一个项目时,您将从用于 导入模块 的 import
语句开始,您可以在文件顶部添加该语句:
我们的游戏.py
import pygame
我们还可以选择在第一行下面添加另一个导入语句,将 pygame 的一些常量和函数添加到文件的 全局命名空间 中:
我们的游戏.py
import pygame from pygame.locals import *
将 pygame 导入我们的程序文件后,我们就可以使用它来创建游戏模板了。
初始化 pygame
从这里开始,我们将使用 init()
函数来初始化 pygame 的功能,它是“initialize”的缩写。
我们的游戏.py
import pygame from pygame.locals import * pygame.init()
init()
函数会自动启动所有你需要初始化的 pygame 模块。
您还可以单独初始化 pygame 的每个模块,如下所示:
pygame.font.init()
如果你愿意,init()
函数会返回一个 tuple 给你。 该元组将显示成功和不成功的初始化。 我们可以为一般的 init()
调用和特定模块的初始化(这将向我们显示这些模块是否可用)执行此操作:
i = pygame.init() print(i) f = pygame.font.init() print(f)
如果我们运行上面的代码,我们将收到类似于以下的输出:
Output(6, 0) None
在这种情况下,i
变量返回元组(6, 0)
,说明pygame初始化成功6次,失败0次。 f
变量返回 None
,表示该模块在此特定环境中不可用。
设置显示表面
从这里开始,我们需要设置我们的游戏显示界面。 我们将使用 pygame.display.set_mode()
来初始化窗口或屏幕以进行显示并将其传递给变量。 在函数中,我们将传递一个显示分辨率的参数,它是一对表示元组中宽度和高度的数字。 让我们将此函数添加到我们的程序中:
我们的游戏.py
import pygame from pygame.locals import * pygame.init() game_display = pygame.display.set_mode((800, 600))
我们将元组 (800, 600)
作为参数传递给 set_mode()
函数,代表宽度(800 像素)和高度(600 像素)的分辨率。 请注意,元组包含在函数的括号内,因此上面的函数中有双括号。
您可能会经常将 整数 用于游戏的分辨率,因此您可能希望将这些数字分配给变量,而不是一次又一次地使用这些数字。 当您需要修改程序时,这可以使您更容易,因为您只需要修改传递给变量的内容。
我们将使用变量 display_width
作为游戏显示的宽度,使用 display_height
作为高度,并将这些变量传递给 set_mode()
函数:
我们的游戏.py
import pygame from pygame.locals import * pygame.init() display_width = 800 display_height = 600 game_display = pygame.display.set_mode((display_width, display_height))
在这一点上,游戏显示表面设置了其宽度和高度的分辨率。
更新显示
接下来,我们需要使用两个可用函数之一来更新游戏界面的显示。
动画通常是不同帧之间随时间的变化。 在考虑动画时,您可能会想到 翻书 ,因为它们由一系列图像组成,从一页到下一页逐渐变化。 这些页面在快速翻阅时会模拟运动,因为页面的内容似乎在运动。 在电脑游戏中,使用框架而不是页面。
因为翻页或翻帧的概念,可以用来更新游戏画面显示的函数之一叫做flip()
,在我们上面的文件中可以这样调用:
pygame.display.flip()
flip()
函数将整个显示表面更新到屏幕。
更频繁地,使用 update()
函数代替 flip()
函数,因为它只会更新屏幕的一部分,而不是整个区域,从而节省内存。
让我们将 update()
函数添加到 our_game.py
文件的底部:
我们的游戏.py
import pygame from pygame.locals import * pygame.init() display_width = 800 display_height = 600 game_display = pygame.display.set_mode((display_width, display_height)) pygame.display.update()
此时,您可以运行程序而不会出现任何错误,但显示表面只会打开并快速关闭。
创建游戏循环
随着 pygame 的导入和初始化、显示设置和游戏界面的更新,我们可以开始处理我们的主游戏循环。
我们将创建一个运行游戏的 while 循环。 循环将调用 True
的 Boolean 值,这意味着循环将永远循环,除非它被中断。
在我们程序的这个主游戏循环中,我们将构造一个 for 循环 来遍历事件队列中的用户事件,该事件队列将由 pygame.event.get()
函数调用。
此时,我们在 for
循环中没有任何内容,但我们可以添加一个 print()
语句来显示代码的行为符合我们的预期。 我们将迭代中的事件作为 print(event)
传递到语句中。
让我们将这两个循环和 print()
语句添加到我们的程序文件中:
我们的游戏.py
import pygame from pygame.locals import * pygame.init() display_width = 800 display_height = 600 game_display = pygame.display.set_mode((display_width, display_height)) pygame.display.update() while True: for event in pygame.event.get(): print(event)
为了确保我们的代码正常工作,让我们运行程序:
python our_game.py
当我们运行文件时,会弹出一个 800x600 的窗口。 要测试事件,您可以将鼠标悬停在窗口上,在窗口内单击,然后按键盘上的键。 这些事件将打印到您的控制台窗口。
您收到的输出将如下所示:
Output<Event(4-MouseMotion {'rel': (616, 355), 'buttons': (0, 0, 0), 'pos': (616, 355)})> <Event(5-MouseButtonDown {'button': 1, 'pos': (616, 355)})> <Event(6-MouseButtonUp {'button': 1, 'pos': (616, 355)})> <Event(2-KeyDown {'scancode': 3, 'key': 102, 'unicode': 'f', 'mod': 0})> <Event(3-KeyUp {'scancode': 3, 'key': 102, 'mod': 0})> ...
此输出显示正在发生的用户事件。 这些事件将在用户生成时控制游戏。 每当您运行 pygame.event.get()
函数时,您的代码都会接受这些事件。
在终端窗口中按 CTRL
+ C
停止程序运行。
此时,您可以删除或 注释掉 print()
语句,因为我们不需要所有这些终端输出。
从这里开始,我们可以通过学习如何退出游戏来完成我们的模板。
退出
要退出一个pygame程序,我们可以先取消初始化相关模块,然后像往常一样退出Python。
pygame.quit()
函数将取消初始化所有 pygame 模块,Python quit()
函数将退出程序。
由于用户可以控制游戏功能和事件,我们还应该知道,当用户通过单击游戏窗口上方的“X”请求程序关闭时,pygame.QUIT
被发送到事件队列角落。
让我们在事件处理 for
循环中使用 条件 if 语句 开始控制程序的流程:
我们的游戏.py
import pygame from pygame.locals import * pygame.init() display_width = 800 display_height = 600 game_display = pygame.display.set_mode((display_width, display_height)) pygame.display.update() while True: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() quit()
在上面的代码中,我们说如果用户请求程序关闭,程序应该使用 pygame.quit()
取消初始化 pygame 模块并使用 quit()
退出程序。
由于我们已经导入了 pygame.locals
,我们可以按原样调用 event.type
和 QUIT
(而不是在这些前面加上 pygame.
)。
虽然用户可能知道点击游戏窗口右上角的“X”,但我们可能希望某些其他用户事件触发退出程序的请求。 我们可以使用 KEYDOWN
事件类型和一个或多个键来做到这一点。
KEYDOWN
事件意味着用户正在按下键盘上的一个键。 出于我们的目的,假设 Q
键(如“退出”)或 ESC
键可以退出程序。 让我们在 for
循环中添加表示这一点的代码:
我们的游戏.py
import pygame from pygame.locals import * pygame.init() display_width = 800 display_height = 600 game_display = pygame.display.set_mode((display_width, display_height)) pygame.display.update() while True: for event in pygame.event.get(): if event.type == QUIT or ( event.type == KEYDOWN and ( event.key == K_ESCAPE or event.key == K_q )): pygame.quit() quit()
我们添加了布尔逻辑运算符,这样如果用户点击了游戏窗口右上角的“X”,或者用户按下了一个退出键,程序就可以退出或 Q
键(注意不区分大小写)。
此时,如果您使用python our_game.py
命令运行程序,您将能够测试游戏运行的功能,然后通过“X”图标退出窗口,或者通过按Q
或 ESC
键。
代码改进和后续步骤
虽然上面的程序功能齐全,但我们可以做一些事情来改进代码。
对于初学者,我们可以将 while
循环中的代码放入 函数定义 中:
def event_handler(): for event in pygame.event.get(): if event.type == QUIT or ( event.type == KEYDOWN and ( event.key == K_ESCAPE or event.key == K_q )): pygame.quit() quit()
这将使 while
循环更加简洁和紧凑,尤其是当我们为游戏添加更多功能时。
此外,为了让游戏更加精美,我们可以在窗口的标题栏上添加一个标题(当前显示为 pygame window
)。 我们可以使用以下行来做到这一点:
pygame.display.set_caption('Our Game')
我们可以将上面的字符串 'Our Game'
设置为我们想要调用游戏的任何内容。
此外,我们可以将 pygame.display.update()
函数移动到主游戏循环中。
现在,我们的完整代码如下所示:
我们的游戏.py
import pygame from pygame.locals import * pygame.init() display_width = 800 display_height = 600 game_display = pygame.display.set_mode((display_width, display_height)) pygame.display.set_caption('Our Game') def event_handler(): for event in pygame.event.get(): if event.type == QUIT or ( event.type == KEYDOWN and ( event.key == K_ESCAPE or event.key == K_q )): pygame.quit() quit() while True: event_handler() pygame.display.update()
您还可以考虑处理上述代码的不同方法,包括使用 break 语句 在进入游戏退出之前退出循环。
从这里开始,您将继续学习如何通过绘图和精灵显示图像、动画图像和控制帧速率等等。 您可以通过阅读pygame官方文档继续了解pygame游戏开发。
结论
本教程引导您将开源模块 pygame 安装到 Python 3 编程环境中,以及如何通过设置可用于控制 Python 游戏主循环的模板来开始进行游戏开发。
要进行使用 Python 模块的其他编程项目,您可以学习“如何使用 Tweepy 库创建 Twitterbot”或“如何使用 matplotlib 绘制数据”。