开始游戏项目
我们将通过创建一个空的 Pygame 窗口开始构建游戏。 后来,我们将在此窗口上绘制游戏元素,例如船和外星人。 我们还将让我们的游戏响应用户输入,设置背景颜色并加载船舶图像。
创建Pygame窗口并响应用户输入
我们将通过创建一个代表游戏的类来制作一个空的 pygame 窗口。 在您的文本编辑器中,创建一个新文件并将其保存为 alien_invasion.py; 然后输入以下内容:
import sys
import pygame
from settings import Settings
class AlienInvasion:
"""Overall class to manage game assets and behavior."""
def __init__(self):
"""Initialize the game, and create game resources."""
pygame.init() (1)
self.clock = pygame.time.Clock()
self.settings = Settings()
self.screen = pygame.display.set_mode( (2)
(self.settings.screen_width, self.settings.screen_height))
pygame.display.set_caption("Alien Invasion")
def run_game(self):
"""Start the main loop for the game."""
while True: (3)
# Watch for keyboard and mouse events.
for event in pygame.event.get(): (4)
if event.type == pygame.QUIT: (5)
sys.exit()
# Redraw the screen during each pass through the loop.
self.screen.fill(self.settings.bg_color)
# Make the most recently drawn screen visible.
pygame.display.flip() (6)
self.clock.tick(60)
if __name__ == '__main__':
# Make a game instance, and run the game.
ai = AlienInvasion()
ai.run_game()
首先,我们导入 sys 和 pygame 模块。 pygame 模块包含我们制作游戏所需的功能。我们将使用 sys 模块中的工具在玩家退出时退出游戏。
外星人入侵始于一个名为 AlienInvasion 的类。在 __init__()
方法中,pygame.init()
函数初始化了 pygame 需要正常工作的背景设置。然后,我们调用 pygame.display.set_mode()
创建一个显示窗口❷,我们将在其上绘制所有游戏的图形元素。 参数 (1200, 800) 是定义游戏窗口尺寸的元组,该窗口的尺寸将为 1,200 像素宽,高 800 像素。(您可以根据您的显示大小调整这些值)我们将此显示窗口分配给属性 self.screen
,因此可以在类中的所有方法中使用。
我们分配给 self.screen 的对象称为表面(surface)。 Pygame 中的表面(surface)是可以显示游戏元素的屏幕的一部分。 游戏中的每个元素,例如外星人或船,都是自己的表面(surface)。 由 display.set_mode() 返回的表面(surface)代表整个游戏窗口。当我们激活游戏的动画循环时,每个通过循环都会重新绘制该表面,因此可以通过用户输入触发的任何更改对其进行更新。
该游戏由 run_game() 方法控制。 此方法包含一个 while 循环❸连续运行。 while 循环包含一个事件循环和代码,可以管理屏幕更新。 事件是用户在玩游戏时执行的操作,例如按键或移动鼠标。 为了使我们的程序响应事件,我们编写一个事件循环以聆听事件并根据发生的事件进行适当的任务。 嵌套在 while 循环内的 for 循环是事件循环。
要访问 PyGame 检测到的事件,我们将使用 pygame.event.get() 函数。 此功能返回自上次调用此功能以来发生的事件列表。 任何键盘或鼠标事件都会导致循环运行。 在循环中,我们将编写一系列 if 语句来检测并响应特定事件。 例如,当玩家单击游戏窗口的关闭按钮时,会检测到 pygame.QUIT 事件,然后我们调用 sys.exit() 退出游戏❺。
调用 pygame.display.flip() ❻告诉 Pygame 使最近绘制的屏幕可见。在这种情况下,它只需在每次 while 循环时绘制一个空屏幕,然后擦除旧屏幕,因此只能看到新屏幕。 当我们四处移动游戏元素时,pygame.display.flip() 不断更新显示器,以显示游戏元素的新位置并隐藏旧的元素,从而产生了平稳运动的错觉。
在文件末尾,我们创建游戏的实例,然后调用 run_game() 。 我们将 run_game() 放在仅当文件直接调用时运行的 if 块中。 运行此 alien_invasion.py 文件时,您应该看到一个空的 pygame 窗口。
控制帧速率
理想情况下,游戏应在所有系统上以相同的速度或帧速率运行。 控制可以在多个系统上运行的游戏的帧速率是一个复杂的问题,但是 PyGame 提供了一种实现此目标的相对简单方法。 我们将制作一个时钟,并确保每次通过主循环一次时钟一次。 每当循环处理的速度比我们定义的速率快,PyGame 都会计算正确的暂停时间,以使游戏以一致的速率运行。
我们将在 __init__()
方法中定义时钟:
def __init__(self):
"""Initialize the game, and create game resources."""
pygame.init() (1)
self.clock = pygame.time.Clock()
初始化 pygame 后,我们从 pygame.time 模块创建了类时钟的实例。然后,我们将在 run_game() 中的 while 循环结束时进行时钟滴答:
def run_game(self):
"""Start the main loop for the game."""
while True: (3)
# Watch for keyboard and mouse events.
for event in pygame.event.get(): (4)
if event.type == pygame.QUIT: (5)
sys.exit()
# Redraw the screen during each pass through the loop.
self.screen.fill(self.settings.bg_color)
# Make the most recently drawn screen visible.
pygame.display.flip() (6)
self.clock.tick(60)
tick() 方法接收一个参数:游戏的帧速率。 在这里,我使用的值为 60,因此 Pygame 将尽最大努力使循环每秒精确运行 60 次。
Pygame 的时钟应该有助于游戏在大多数系统上持续运行。如果它使游戏在系统上持续不断运行,则可以为帧速率尝试不同的值。如果您在系统上找不到良好的帧速率,则可以完全排除时钟并调整游戏的设置,使其在系统上运行良好。 |
设置背景颜色
Pygame 默认情况下会创建黑屏,但这很无聊。让我们设置不同的背景颜色。我们将在 __init__()
方法的末尾执行此操作。
Pygame 中的颜色指定为 RGB 颜色:红色,绿色和蓝色的混合物。 每个颜色值的范围从 0 到 255。颜色值 (255,0,0) 为红色,(0,255,0) 为绿色,(0,0,255) 为蓝色。 您可以混合不同的 RGB 值以创建多达 1600 万种颜色。 颜色值 (230,230,230) 混合了相等数量的红色,蓝色和绿色,产生浅灰色背景颜色。 我们将此颜色分配给 self.bg_color ❶。
我们使用 Fill() 方法❷填充屏幕,该方法作用在表面(surface)上,仅接收一个参数:颜色。
创建一个设置类
每次我们将新功能引入游戏时,我们通常也会创建一些新设置。 让我们编写一个名为 settings 的模块,该模块包含一个名为 Settings 的类,将所有这些值存储在一个位置中。 这种方法允许我们随时随地使用一个 settings 对象来访问单个设置。这也使随着项目的增长而更容易修改游戏的外观和行为。要修改游戏,我们将更改 settings.py 中的相关值,我们将在下一步创建,而不是在整个项目中搜索不同的设置。
在您的 alien_invasion 文件夹中创建一个名为 settings.py 的新文件,并添加此初始 Settings 类:
class Settings:
"""A class to store all settings for Alien Invasion."""
def __init__(self):
"""Initialize the game's settings."""
# Screen settings
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230, 230, 230)
为了在项目中创建 Settings 的实例并使用它来访问我们的设置,我们需要修改 alien_invasion.py,如下所示:
我们将 Settings 导入主程序文件。 然后,我们创建一个 Settings 的实例,并在调用 pygame.init() 之后,将其分配给 self.settings ❶。 当我们创建屏幕❷时,我们会使用self.Settings 的 screen_width 和 screen_height 属性,然后我们使用 self.settings 在填充屏幕时访问背景颜色。
当您运行 alien_invasion.py 时,您还没有看到任何更改,因为我们所做的仅仅是移动已经在其他地方使用的设置。 现在,我们准备开始在屏幕上添加新元素。