介绍
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.type
和QUIT
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
图标离开窗口或按Q
或ESC
键来测试运行游戏的功能,然后停止。
代码改进和下一步
虽然上述程序是完全功能的,但我们可以做一些事情来改进代码。
首先,我们可以将位于而
循环中的代码放入一个 函数定义:
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)
。