Python编程:从入门到实践
章节

第 12 章 武装飞船

第一个完整项目登场,游戏循环和图形界面进入视野

项目部分从 Pygame 开始,让读者第一次把此前分散的 Python 技能拼成一个会运行的图形程序。

章节主张

项目学习最重要的,不是做出一个小游戏,而是第一次体验多个模块、状态与资源协同工作。

中文释读

Alien Invasion 项目的开篇很有代表性:设置、窗口、事件、飞船图像、屏幕坐标、主循环,一个都不能少。你会第一次意识到,真实程序不是几行孤立代码,而是一套持续运行、持续响应输入的系统。这种系统感,是项目学习能给初学者带来的最大增量。

本章知识路线

  1. 游戏循环是实时程序理解系统行为的好入口
  2. 图形程序很多时候不是你主动推进,而是事件在驱动

关键论点

  • Pygame 项目把前面学过的结构化代码真正用起来。
  • 主循环是实时程序的核心骨架。
  • 图像、事件和坐标系会让抽象代码变得具象。

行动清单

  • 先搞懂设置类、主类和资源类如何分工。
  • 把事件循环看成程序心跳。
  • 用小步改动验证图形程序的变化。

源章节深读

第 12 章 武装⻜船 我们来开发⼀个名为《外星⼈⼊侵》的游戏吧!为此,我们将使⽤ Pygame 这个功能强⼤⽽且⾮常有趣的模块,它可以管理游戏制中⽤到 的图像、动画甚⾄声⾳,让你能够更轻松地开发复杂的游戏。使⽤ Pygame 来处理在屏幕上绘制图像等任务,有助于你将重⼼放在设计游 戏的⾼级逻辑上。 在本章中,你将安装 Pygame ,然后创建⼀艘能够根据⽤户输⼊左右移动和 射击的武装⻜船。在接下来的两章中,你将创建⼀个作为射击⽬标的外星 舰队,并改进这款游戏:限制玩家可使⽤的⻜船数,以及添加记分牌。 在开发这款游戏的过程中,你还将学习如何管理包含多个⽂件的⼤型项 ⽬。你将学习如何通过重构代码和管理⽂件内容,来创建整洁、代码⾼效 的项⽬。 开发游戏是趣学语⾔的⼀种理想⽅式。看别⼈玩你编写的游戏能获得满⾜ 感,编写简单的游戏也有助于你明⽩专业⼈员是如何开发游戏的。在阅读 本章的过程中,请动⼿输⼊并运⾏代码,理解各个代码块对整个游戏的贡 献。另外,请尝试不同的值和设置,以便更好地理解如何提升游戏的交互 性。

12.1 规划项目

12.1 规划项⽬ 在开发⼤型项⽬时,先制定好规划再动⼿编写代码很重要。规划可确保你 不偏离轨道,提⾼项⽬成功的可能性。 下⾯来为游戏《外星⼈⼊侵》编写⼤概的玩法说明,其中虽然没有涵盖这 款游戏的所有细节,但能让你清楚地知道该如何动⼿开发它: 在游戏《外星⼈⼊侵》中,玩家控制着⼀艘最初出现在屏幕底部中央 的武装⻜船。玩家可以使⽤⽅向键左右移动⻜船,使⽤空格键进⾏射 击。当游戏开始时,⼀个外星舰队出现在天空中,并向屏幕下⽅移 动。玩家的任务是消灭这些外星⼈。

这节解决什么:这一节主要解决《第 12 章 武装飞船》里一个更具体的子问题:12.1 规划项目 该怎样落到实际代码或项目动作上。

怎么用到自己的系统:不要只把它当书中的小节标题,最好把它改写成一个你能亲手运行、修改或调试的微练习。

提醒:常见误区是只看懂例子表面流程,却没有把这一节抽成自己能迁移的规则。

12.2 安装 Pygame

12.2 安装 Pygame 开始写程序前,需要安装 Pygame 。这⾥将像第 11 章安装 pytest 那样安 装 Pygame—— 使⽤ pip 。如果你跳过了第 11 章,或者需要复习 pip 的⽤ 法,请参阅 11.1 节。

这节解决什么:这一节主要解决《第 12 章 武装飞船》里一个更具体的子问题:12.2 安装 Pygame 该怎样落到实际代码或项目动作上。

怎么用到自己的系统:不要只把它当书中的小节标题,最好把它改写成一个你能亲手运行、修改或调试的微练习。

提醒:常见误区是只看懂例子表面流程,却没有把这一节抽成自己能迁移的规则。

12.3 开始游戏项目

12.3 开始游戏项⽬ 现在开始开发游戏《外星⼈⼊侵》。⾸先创建⼀个空的 Pygame 窗⼝,稍后 将在其中绘制游戏元素,如⻜船和外星⼈。之后,我们还将让这个游戏响 应⽤户输⼊,设置背景⾊,以及加载⻜船图像。 12.3.1 创建 Pygame 窗⼝及响应⽤户输⼊ 下⾯创建⼀个表⽰游戏的类,以创建空的 Pygame 窗⼝。

这节解决什么:这一节主要解决《第 12 章 武装飞船》里一个更具体的子问题:12.3 开始游戏项目 该怎样落到实际代码或项目动作上。

怎么用到自己的系统:不要只把它当书中的小节标题,最好把它改写成一个你能亲手运行、修改或调试的微练习。

提醒:常见误区是只看懂例子表面流程,却没有把这一节抽成自己能迁移的规则。

12.4 添加飞船图像

12.4 添加⻜船图像 下⾯将⻜船加⼊游戏。为了在屏幕上绘制玩家的⻜船,需要先加载⼀幅图 像,再使⽤ Pygame blit() ⽅法绘制它。 在为游戏选择素材时,务必注意是否有版权许可。最安全、成本最低的⽅ 式是使⽤ OpenGameArt 等⽹站提供的免费图形,这些素材⽆须授权许可即 可使⽤和修改。 在游戏中,可以使⽤⼏乎任意类型的图像⽂件,但使⽤位图( .bmp )⽂件 最为简单,因为 Pygame 默认加载位图。

这节解决什么:这一节主要解决《第 12 章 武装飞船》里一个更具体的子问题:12.4 添加飞船图像 该怎样落到实际代码或项目动作上。

怎么用到自己的系统:不要只把它当书中的小节标题,最好把它改写成一个你能亲手运行、修改或调试的微练习。

提醒:常见误区是只看懂例子表面流程,却没有把这一节抽成自己能迁移的规则。

12.5 重构:_check_events() 方法和 _update_screen() 方法

12.5 重构:_check_events() ⽅法和 _update_screen() ⽅法 在⼤型项⽬中,经常需要在添加新代码前重构既有的代码。重构旨在简化 既有代码的结构,使其更容易扩展。本节将把越来越⻓的 run_game() ⽅ 法拆分成两个辅助⽅法。辅助⽅法( helper method )⼀般只在类中调⽤,不 会在类外调⽤。在 Python 中,辅助⽅法的名称以单下划线打头。

这节解决什么:这一节主要解决《第 12 章 武装飞船》里一个更具体的子问题:12.5 重构:_check_events() 方法和 _update_screen() 方法 该怎样落到实际代码或项目动作上。

怎么用到自己的系统:不要只把它当书中的小节标题,最好把它改写成一个你能亲手运行、修改或调试的微练习。

提醒:常见误区是只看懂例子表面流程,却没有把这一节抽成自己能迁移的规则。

12.6 驾驶飞船

12.6 驾驶⻜船 下⾯来让玩家能够左右移动⻜船。你将编写代码,在⽤户按左右⽅向键时 做出响应。先看看如何向右移动,再以同样的⽅式控制⻜船向左移动。通 过这样做,你将学会移动屏幕上的图像以及响应⽤户输⼊。 12.6.1 响应按键 在 Pygame 中,事件都是通过 pygame.event.get() ⽅法获取的,因此 需要在 _check_events() ⽅法中指定要检查的事件类型。每当⽤户按键 时,都将在 Pygame 中产⽣⼀个 KEYDOWN 事件。

这节解决什么:这一节主要解决《第 12 章 武装飞船》里一个更具体的子问题:12.6 驾驶飞船 该怎样落到实际代码或项目动作上。

怎么用到自己的系统:不要只把它当书中的小节标题,最好把它改写成一个你能亲手运行、修改或调试的微练习。

提醒:常见误区是只看懂例子表面流程,却没有把这一节抽成自己能迁移的规则。

12.7 简单回顾

12.7 简单回顾 下⼀节将添加射击功能,为此需要新增⼀个名为 bullet.py 的⽂件,并修改 ⼀些既有的⽂件。当前有三个⽂件,其中包含很多类和⽅法。在添加其他 功能前,先来回顾⼀下这些⽂件,以便对这个项⽬的组织结构有清楚的认 识。

这节解决什么:这一节主要解决《第 12 章 武装飞船》里一个更具体的子问题:12.7 简单回顾 该怎样落到实际代码或项目动作上。

怎么用到自己的系统:不要只把它当书中的小节标题,最好把它改写成一个你能亲手运行、修改或调试的微练习。

提醒:常见误区是只看懂例子表面流程,却没有把这一节抽成自己能迁移的规则。

12.8 射击

12.8 射击 下⾯来添加射击功能。我们将编写在玩家按空格键时发射⼦弹(⽤⼩矩形 表⽰)的代码。⼦弹将在屏幕中直线上升,并在抵达屏幕上边缘后消失。

这节解决什么:这一节主要解决《第 12 章 武装飞船》里一个更具体的子问题:12.8 射击 该怎样落到实际代码或项目动作上。

怎么用到自己的系统:不要只把它当书中的小节标题,最好把它改写成一个你能亲手运行、修改或调试的微练习。

提醒:常见误区是只看懂例子表面流程,却没有把这一节抽成自己能迁移的规则。

辨析题

为什么做游戏项目会让很多初学者突然开窍?

本章图版学习路径

游戏循环是实时程序理解系统行为的好入口

图形程序很多时候不是你主动推进,而是事件在驱动