1.1 创建pygame窗口及响应用户输入:
首先,我创建一个空的pygame窗口。使用pygame编写的游戏的基本结构如下:
import sys
import pygame
def run_game():
pygame.init() #初始化
screen = pygame.display.set_mode((1200,800)) #调用这个来创建名为screen的窗口
pygame.display.set_caption('Alien Invasion') #命名游戏
#开始游戏的主循环
while True:
#侦听事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.display.flip() #不断更新屏幕,以显示元素的新位置
run_game() #初始化游戏并开始主循环
简要分析一下:
- 代码行
pygame.init()
初始化背景设置,让Pygame能够正确地工作。 - 我又调用了
pygame.display.set_mode()
来创建一个名为screen 的显示窗口,这个游戏的所有图形元素都将在其中绘制。对象screen 是一个surface。在Pygame中,surface是屏幕的一部分,用于显示游戏元素。display.set_mode()
返回的surface表示整个游戏窗口。 - 这个游戏由一个while 循环控制,其中包含一个事件循环以及管理屏幕更新的代码。事件是用户玩游戏时执行的操作,如按键或移动鼠标。为让程序响应事件,我们编写一个事件循环,以侦听事件,并根据发生的事件执行相应的任务。其中的for循环就是一个事件循环。
- 为访问Pygame检测到的事件,我们使用方法
pygame.event.get()
。所有键盘和鼠标事件都将促使for 循环运行。 - 我接着调用了
pygame.display.flip()
,命令Pygame让最近绘制的屏幕可见。pygame.display.flip()
将不断更新屏幕,以显示元素的新位置,并在原来的位置隐藏元素,从而营造平滑移动的效果。 - 最后一行调用了
run_game()
,这将初始化游戏并开始主循环。
如果此时运行这些代码,你将看到一个空的Pygame窗口(如下图):
1.2 设置背景色:
首先,我们创建了一种背景色,并将其存储在bg_color
中。该颜色只需指定一次,因此我们在进入主while循环前定义它。
我们又调用方法screen.fill()
,用背景色填充屏幕;这个方法只接受一个实参:一种颜色。
完成后效果如下图所示:
1.3 创建设置类:
编写一个名为settings的模块,其中包含一个名为Settings 的类,用于将所有设置存储在一个地方,以免在代码中到处添加设置。这样,我们就能传递一个设置对象,而不是众多不同的设置:
在主程序文件中,我们导入Settings 类,调用pygame.init()
,再创建一个Settings实例,并将其存储在变量ai_settings
中。创建屏幕时,使用了ai_settings
的属性screen_width
和screen_height
;接下来填充屏幕时,也使用了ai_settings
来访问背景色。
2.1 创建飞船图像:
下面将飞船加入到游戏中,选择用于表示飞船的图像后,需要将其显示到屏幕上。我们将创建一个名为ship的模块,其中包含Ship 类,它负责管理飞船的大部分行为:
简要分析一下:
- 首先,我们导入了模块pygame 。Ship 的方法
__init__()
接受两个参数:引用self 和screen ,其中后者指定了要将飞船绘制到什么地方。为加载图像,我们调用了pygame.image.load()
, - 加载图像后,我们使用
get_rect()
获取相应surface的属性rect , - 要将游戏元素居中,可设置相应rect 对象的属性center 、centerx 或centery 。要让游戏元素与屏幕边缘对齐,可使用属性top 、bottom 、left 或right ;要调整游戏元素的水平或垂直位置,可使用属性x 和y ,它们分别是相应矩形左上角的 x 和 y 坐标。
- 我们将把飞船放在屏幕底部中央。为此,首先将表示屏幕的矩形存储在
self.screen_rect
中,再将self.rect.centerx
(飞船中心的x坐标)设置为表示屏幕的矩形的属性centerx ,并将self.rect.bottom
(飞船下边缘的y 坐标)设置为表示屏幕的矩形的属性bottom 。Pygame将使用这些rect 属性来放置飞船图像, 使其与屏幕下边缘对齐并水平居中。 - 最后,我们定义了方法
blitme()
,它根据self.rect
指定的位置将图像绘制到屏幕上。
下面来更新alien_invasion.py
,使其创建一艘飞船,并调用其方法blitme()
:
我们导入Ship 类,并在创建屏幕后创建一个名为ship 的Ship 实例。必须在主while 循环前面创建该实例,以免每次循环时都创建一艘飞船。填充背景后,我们调用ship.blitme()
将飞船绘制到屏幕上,确保它出现在背景前面。
现在如果运行,将看到飞船位于空游戏屏幕底部中央: