使用Pygame模块来开发一个简单的小游戏,这是一组功能强大而有趣的模块,可用于管理图形、动画乃至声音,可以让人能够更轻松地开发复杂的游戏。通过使用Pygame来处理在屏幕上绘制图像等任务,就不用考虑众多烦琐而艰难的编码工作,而是将重点放在程序的高级逻辑上。
首先了解Pygame模块,使用Pygame编写的游戏的基本基本结构如下:
import sys import pygame def run_game(): # 初始化游戏并创建一个屏幕对象 pygame.init() screen = pygame.display.set_mode((1200, 800)) pygame.display.set_caption("Alien Invasion") #设置背景色 bg_color=(230,230,230) # 开始游戏的主循环 while True: # 监视键盘和鼠标事件 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() #每次循环时重绘屏幕 screen.fill(bg_color) # 让最近绘制的屏幕可见 pygame.display.flip() run_game()
pygame.init()初始化背景设置,让Pygame能够正确地工作。通过调用pygame.display.set_mode()来创建一个名为screen的显示窗口,这个游戏的所有图形元素都将在其中绘制。参数‘(1200,800)’是一个元组,指定了窗口的尺寸。对象screen是一个surface。在Pygame中,surface是屏幕的一部分,用于显示游戏元素。在这个游戏中,每个元素(如外星人或飞船)都是一个surface。display.set_mode()返回的surface表示整个游戏窗口。我们激活游戏的动画循环后,每经过一次循环都将自动重绘这个surface。
为访问Pygame检测到的事件,我们使用方法pygame.event.get()。所有键盘和鼠标事件都将促使for循环运行。在for循环内我们使用if语句来检测并响应相应的事件,如上述代码中的
if event.type == pygame.QUIT:
sys.exit()
就是点击关闭按钮时会检测到Pygame.QUIT事件,然后通过sys模块退出游戏。
调用了pygame.display.flip(),命令Pygame让最近绘制的屏幕可见。在这里,它在每次执行while循环时都绘制一个空屏幕,并擦去旧屏幕,使得只有新屏幕可见。
设置背景色bg_color,然后在循环中调用方法screen.fill(),用背景色填充屏幕;这个方法只接受一个实参:一种颜色。
如果此时运行这些代码,你将看到一个空的Pygame窗口。如下:
每次给游戏添加新功能时,通常也将引入一些新设置。下面来编写一个名为settings的模块,其中包含一个名为Settings的类,用于将所有设置存储在一个地方,以免在代码中到处添加设置。先给出如下settings类用来替换上面代码里的一些参数:
class Settings(): """存储《外星人入侵》的所有设置的类""" def __init__(self): """初始化游戏的设置""" # 屏幕设置 self.screen_width = 1200 self.screen_height = 800 self.bg_color = (230, 230, 230)
这样的话,已有代码变为:
import sys from settings import Settings import pygame def run_game(): # 初始化游戏并创建一个屏幕对象 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: # 监视键盘和鼠标事件 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() #每次循环时重绘屏幕 screen.fill(ai_settings.bg_color) # 让最近绘制的屏幕可见 pygame.display.flip() run_game()
其次了解这个小游戏玩法上的具体细节: 在游戏《外星人入侵》中,玩家控制着一艘最初出现在屏幕底部*的飞船。玩家可以使用箭头键左右移动飞船,还可使用空格键进行射击。游戏开始时,一群外星人出现在天空中,他们在屏幕中向下移动。玩家的任务是射杀这些外星人。玩家将所有外星人都消灭干净后,将出现一群新的外星人,他们移动的速度更快。只要有外星人撞到了玩家的飞船或到达了屏幕底部,玩家就损失一艘飞船。玩家损失三艘飞船后,游戏结束。(这应该是一个项目中首先要知道的事)
根据上述描述可以知道我们需要如下模块:
名为ship的模块,其中包含Ship类,它负责管理飞船的大部分行为。
名为game_functions的新模块,它将存储大量让游戏《外星人入侵》运行的函数。
存储Bullet类的文件bullet.py,负责管理子弹的大部分行为。
每个外星人的行为都由Alien类控制,将像创建Ship类那样创建这个类。
一个用于跟踪游戏统计信息的新类——GameStats,并将其保存为文件game_stats.py
----------------------------------------------------------------------------------------未完待续------------------------------------------------------------------------------------------------
ps:
相关内容摘自:《Python编程:从入门到实践》 — 〔美〕埃里克·马瑟斯