外星人入侵-武装飞船
规划项目
游戏《外星人入侵》大概的玩法说明:
在游戏《外星人入侵》中,玩家控制着一艘最初出现在屏幕底部中央的武装飞船。玩家可以使用方向键左右移动飞船,使用空格键进行射击。当游戏开始时,一个外星舰队出现在天空中,并向屏幕下方移动。玩家的任务是消灭这些外星人。玩家将外星人消灭干净后,将出现一个新的外星舰队,其移动速度更快。只要有外星人撞到玩家的飞船或到达屏幕下边缘,玩家就损失一艘飞船。玩家损失三艘飞船后,游戏结束。
在开发的第一个阶段,我们将创建一艘飞船,这艘飞船在用户按方向键时能够左右移动,并在用户按空格键时开火。设置这种行为后,就可以创建外星人以提高游戏的可玩性了。
安装 Pygame
在终端窗口执行如下代码:
pip install -i https://mirrors.aliyun.com/pypi/simple/ pygame
或者
python3 -m pip install --user pygame
开始游戏项目
在系统中新建一个名为 alien_invasion 的文件夹,并将这个项目的所有文件都存储到该文件夹中。
首先创建一个空的 Pygame 窗口,稍后将在其中绘制游戏元素,如飞船和外星人。之后,我们还将让这个游戏响应用户输入,设置背景色,以及加载飞船图像。
-
创建 Pygame 窗口及响应用户输入
下面创建一个表示游戏的类,以创建空的 Pygame 窗口。
alien_invasion.py
import sysimport pygameclass AlienInvasion:"""管理游戏资源和行为的类"""def __init__(self):"""初始化游戏并创建游戏资源"""
❶ pygame.init()❷ self.screen = pygame.display.set_mode((1200, 800))pygame.display.set_caption("Alien Invasion")def run_game(self):"""开始游戏的主循环"""
❸ while True:# 侦听键盘和鼠标事件
❹ for event in pygame.event.get():
❺ if event.type == pygame.QUIT:sys.exit()# 让最近绘制的屏幕可见
❻ pygame.display.flip()if __name__ == '__main__':# 创建游戏实例并运行游戏ai = AlienInvasion()ai.run_game()
-
控制帧率
我们将创建一个时钟(clock),并确保它在主循环每次通过后都进行计时(tick)。当这个循环的通过速度超过我们定义的帧率时,Pygame 会计算需要暂停多长时间,以便游戏的运行速度保持一致。
我们在 __init__()
方法中pygame初始化后定义这个时钟:
self.clock = pygame.time.Clock()
然后在 run_game()
的 while
循环末尾让这个时钟进行计时:
self.clock.tick(60)
tick()
方法接受一个参数:游戏的帧率。这里使用的值为 60, Pygame 将尽可能确保这个循环每秒恰好运行 60 次。
-
设置背景色
在内存中设置好背景色,再绘制屏幕
self.screen.fill((230,230,230))# 让最近绘制的屏幕可见pygame.display.flip()
-
创建
Settings
类
class Settings:def __init__(self):self.screen_width = 1000self.screen_height = 800self.bg_color = (230,230,230)
然后在游戏类中使用这些设置
from settings import Settingsself.settings = Settings()self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))self.screen.fill(self.settings.bg_color)
添加飞船图像
-
创建 Ship 类
-
在屏幕上绘制飞船
重构
-
_check_events() 方法
-
_update_screen() 方法
动手试一试
练习 12.1:蓝色的天空 创建一个背景为蓝色的 Pygame 窗口。
练习 12.2:游戏角色 找一幅你喜欢的游戏角色的位图图像或将一幅图像转换为位图。创建一个类,将该角色绘制到屏幕中央,并将该图像的背景色设置为屏幕的背景色或将屏幕的背景色设置为该图像的背景色。
驾驶飞船
-
响应按键
-
允许持续移动
-
左右移动
-
调整飞船的速度
-
限制飞船的活动范围
-
重构 _check_events()
-
按 Q 键退出
-
在全屏模式下运行游戏
简单回顾
-
alien_invasion.py
-
settings.py
-
ship.py
动手试一试
练习 12.3:Pygame 文档 经过一段时间的游戏开发实践,你可能想看看 Pygame 的文档(可在 Pygame 主页中找到)。目前,只需大致浏览一下文档即可。在完成本章项目的过程中,不需要参阅这些文档,但如果你想修改游戏《外星人入侵》或编写自己的游戏,这些文档会有所帮助。
练习 12.4:火箭 编写一个游戏,它在屏幕中央显示一艘火箭,而玩家可使用上下左右四个方向键移动火箭。务必确保火箭不会移动到屏幕之外。
练习 12.5:按键 编写一个创建空屏幕的 Pygame 文件。在事件循环中,每当检测到
pygame.KEYDOWN
事件时都打印属性event.key
。运行这个程序并按下不同的键,看看控制台窗口的输出,以便了解 Pygame 会如何响应。
射击
-
添加子弹设置
-
创建 Bullet 类
-
将子弹存储到编组中
-
开火
-
删除已消失的子弹
-
限制子弹数量
-
创建 _update_bullets() 方法
动手试一试
练习 12.6:《横向射击》 编写一个游戏,将一艘飞船放在屏幕左侧,并允许玩家上下移动飞船。在玩家按空格键时,让飞船发射一颗在屏幕中向右飞行的子弹,并在子弹从屏幕中消失后将其删除。
小结
在本章中,你首先学习了游戏开发计划的制定以及使用 Pygame 编写的游戏的基本结构。接着学习了如何设置背景色,以及如何将设置存储在独立的类中,以便将来可以轻松地调整。然后学习了如何在屏幕上绘制图像,以及如何让玩家控制游戏元素的移动。你不仅创建了能自动移动的元素,如在屏幕中直线上升的子弹,还删除了不再需要的对象。最后,你学习了经常性重构是如何为项目的后续开发提供便利的。