如何安装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 循环。 循环将调用 TrueBoolean 值,这意味着循环将永远循环,除非它被中断。

在我们程序的这个主游戏循环中,我们将构造一个 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.typeQUIT(而不是在这些前面加上 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”图标退出窗口,或者通过按QESC 键。

代码改进和后续步骤

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

对于初学者,我们可以将 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 绘制数据”。