现在来开始开发游戏《外星人入侵》。首先创建一个空的Pygame窗口,供后面用来绘制游戏元素,如飞船和外星人。我们还将让这个游戏响应用户输入、设置背景色以及加载飞船图像。 12.3.1 创建Pygame窗口以及响应用户输入 首先,我们创建一个空的Pygame窗口。使用Pygame编写的游戏的基本结构如下: alien_invasion.py import sys import pygame def run_game(): # 初始化游戏并创建一个屏幕对象 pygame.init() screen = pygame.display.set_mode((1200, 800)) 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() 首先,我们导入了模块sys和pygame。模块pygame包含开发游戏所需的功能。玩家退出时,我们将使用模块sys来退出游戏。 游戏《外星人入侵》的开头是函数run_game()。处的代码行pygame.init()初始化背景设置,让Pygame能够正确地工作。在处,我们调用pygame.display.set_mode()来创建一个名为screen的显示窗口,这个游戏的所有图形元素都将在其中绘制。实参(1200, 800)是一个元组,指定了游戏窗口的尺寸。通过将这些尺寸值传递给pygame.display.set_mode(),我们创建了一个宽1200像素、高800像素的游戏窗口(你可以根据自己的显示器尺寸调整这些值)。 对象screen是一个surface。在Pygame中,surface是屏幕的一部分,用于显示游戏元素。在这个游戏中,每个元素(如外星人或飞船)都是一个surface。display.set_mode()返回的surface表示整个游戏窗口。我们激活游戏的动画循环后,每经过一次循环都将自动重绘这个surface。 这个游戏由一个while循环(见)控制,其中包含一个事件循环以及管理屏幕更新的代码。事件是用户玩游戏时执行的操作,如按键或移动鼠标。为让程序响应事件,我们编写一个事件循环,以侦听事件,并根据发生的事件执行相应的任务。处的for循环就是一个事件循环。 为访问Pygame检测到的事件,我们使用方法pygame.event.get()。所有键盘和鼠标事件都将促使for循环运行。在这个循环中,我们将编写一系列的if语句来检测并响应特定的事件。例如,玩家单击游戏窗口的关闭按钮时,将检测到pygame.QUIT事件,而我们调用sys.exit()来退出游戏(见)。 处调用了pygame.display.flip(),命令Pygame让最近绘制的屏幕可见。在这里,它在每次执行while循环时都绘制一个空屏幕,并擦去旧屏幕,使得只有新屏幕可见。在我们移动游戏元素时,pygame.display.flip()将不断更新屏幕,以显示元素的新位置,并在原来的位置隐藏元素,从而营造平滑移动的效果。 在这个基本的游戏结构中,最后一行调用run_game(),这将初始化游戏并开始主循环。 如果此时运行这些代码,你将看到一个空的Pygame窗口。 12.3.2 设置背景色 Pygame默认创建一个黑色屏幕,这太乏味了。下面来将背景设置为另一种颜色: alien_invasion.py --snip-- def run_game(): --snip-- pygame.display.set_caption("Alien Invasion") # 设置背景色 bg_color = (230, 230, 230) # 开始游戏主循环. while True: # 监听键盘和鼠标事件 --snip-- # 每次循环时都重绘屏幕 screen.fill(bg_color) # 让最近绘制的屏幕可见 pygame.display.flip() run_game() 首先,我们创建了一种背景色,并将其存储在bg_color中(见)。该颜色只需指定一次,因此我们在进入主while循环前定义它。 在Pygame中,颜色是以RGB值指定的。这种颜色由红色、绿色和蓝色值组成,其中每个值的可能取值范围都为0~255。颜色值(255, 0, 0)表示红色,(0, 255, 0)表示绿色,而(0, 0, 255)表示蓝色。通过组合不同的RGB值,可创建1600万种颜色。在颜色值(230, 230, 230)中,红色、蓝色和绿色量相同,它将背景设置为一种浅灰色。 在处,我们调用方法screen.fill(),用背景色填充屏幕;这个方法只接受一个实参:一种颜色。 12.3.3 创建设置类 每次给游戏添加新功能时,通常也将引入一些新设置。下面来编写一个名为settings的模块,其中包含一个名为Settings的类,用于将所有设置存储在一个地方,以免在代码中到处添加设置。这样,我们就能传递一个设置对象,而不是众多不同的设置。另外,这让函数调用更简单,且在项目增大时修改游戏的外观更容易:要修改游戏,只需修改settings.py中的一些值,而无需查找散布在文件中的不同设置。 下面是最初的Settings类: settings.py class Settings(): """存储《外星人入侵》的所有设置的类""" def __init__(self): """初始化游戏的设置""" # 屏幕设置 self.screen_width = 1200 self.screen_height = 800 self.bg_color = (230, 230, 230) 为创建Settings实例并使用它来访问设置,将alien_invasion.py修改成下面这样: alien_invasion.py --snip-- import pygame from settings import Settings def run_game(): # 初始化pygame、设置和屏幕对象 pygame.init() ai_settings = Settings() screen = pygame.display.set_mode( (ai_settings.screen_width, ai_settings.screen_height)) pygame.display.set_caption("Alien Invasion") # 开始游戏主循环 while True: --snip-- # 每次循环时都重绘屏幕 screen.fill(ai_settings.bg_color) # 让最近绘制的屏幕可见 pygame.display.flip() run_game() 在主程序文件中,我们导入Settings类,调用pygame.init(),再创建一个Settings实例,并将其存储在变量ai_settings中(见)。创建屏幕时(见),使用了ai_settings的属性screen_width和screen_height;接下来填充屏幕时,也使用了ai_settings来访问背景色(见)。
Python编程:从入门到实践——12.3 开始游戏项目
书名: Python编程:从入门到实践
作者: [美] 埃里克·马瑟斯
出版社: 人民邮电出版社
原作名: Python Crash Course
副标题: 从入门到实践
译者: 袁国忠
出版年: 2016-7-1
页数: 459
定价: CNY 89.00
装帧: 平装
ISBN: 9787115428028