现在开始开发游戏《外星人入侵》,创建一个空的Pygame窗口,导入模块sys和pygame,其中sys模块用于退出游戏。
关于背景的设置放在Settings类中,以免在代码中添加设置。在下面主程序文件中导入Settings类。同样创建一个Ship类,它负责管理飞船的大部分行为,并在主程序中导入Ship类。
pygame.init()用于初始化背景设置,创建一个Settings实例并储存在ai_settings中。我们调用pygame.display.set_mode()来创建一个名为screen的显示窗口,参数是一个元组使用了ai_settings的属性用于指定游戏窗口的尺寸,我们可以在Settings类中进行修改。接着创建一个名为ship的Ship实例,一定要在循环之前,防止每次循环都创建一艘飞船。在后面调用ship.blitme()将飞船绘an制在屏幕上。
这个游戏由一个循环控制,包含一个事件循环和管理屏幕的代码。事件使用户游戏时的操作,如按键及鼠标的移动。使用pygame.event.get()访问pygame检测到的事件。当玩家单击游戏窗口的关闭按钮时即检测到pygame.QUIT事件,将调用sys.exit()退出游戏。调用 pygame.display.flip()不断更新屏幕,调用screen.fill()用背景颜色填充屏幕,此方法只接受一个实参,即一种颜色。最后调用run_game()初始化游戏并开始主循环。
# _*_ coding:gb2312 _*_
import sys
import pygame
from settings import Settings
from ship import Ship
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")
#创建一搜飞船
ship=Ship(screen)
#开始游戏的主循环
while True:
#监视键盘和鼠标事件
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
#每次循环时重绘屏幕
screen.fill(ai_settings.bg_color)
ship.blitme()
#让最近绘制的屏幕可见
pygame.display.flip()
run_game()
Settings类中,背景色以RGB值指定,这种颜色由红、绿、蓝组成,每个值的范围为0~255,(255,0,0)表示红色,(0,255,0)
表示绿色,(0,0,255)代表蓝色。可创建1600万种颜色,(230,230,230)是一种浅灰色。
# _*_ coding:gb2312 _*_
class Settings():
"""储存《外星人入侵》的所有设置的类"""
def __init__(self):
"""初始化游戏的设置"""
#屏幕设置
self.screen_width=1200
self.screen_height=600
self.bg_color=(230,230,230)
在选用游戏素材时,其图像文件使用位图最简单,将飞船的位图图像名为ship.bmp并储存在主项目文件夹下,名新的文件夹为images。为加载图像调用pygame.image.load(),返回的surface储存在self.image中,使用get_rect()获取相应飞船属性储存在self.rect中,将表示屏幕的矩形储存在self.screen_rect中。
为使放在屏幕底部中央飞船将表示飞船中心的x坐标self.rect.centerx设置为表示屏幕矩形的属性centerx。将表示飞船下边缘的y坐标self.rect.bottom设置为表示屏幕矩形的属性bottom。
最后定义方法blitme(),根据self.rect指定的位置将图像绘制到屏幕上。
# _*_ coding:gb2312 _*_
import pygame
class Ship():
def __init__(self,screen):
"""初始化飞船并设计其初始位置"""
self.screen=screen
#加载飞船图像并获取其外接矩形
self.image=pygame.image.load('images/ship.bmp')
self.rect=self.image.get_rect()
self.screen_rect=screen.get_rect()
#将每艘新飞船放在屏幕底部中央
self.rect.centerx=self.screen_rect.centerx
self.rect.bottom=self.screen_rect.bottom
def blitme(self):
"""在指定位置绘制飞船"""
self.screen.blit(self.image,self.rect)
结果如图所示:
为简化代码的结构,进行重构,模块game_functions。即将主程序中管理事件和屏幕更新的代码放到模块game_functions中,对代码进行重构会使其更容易扩展。
代码如下:
# _*_ coding:gb2312 _*_
import sys
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
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")
#创建一搜飞船
ship=Ship(screen)
#开始游戏的主循环
while True:
gf.check_events()
gf.update_screen(ai_settings,screen,ship)
run_game()
# _*_ coding:gb2312 _*_
#game_funtions模块
import sys
import pygame
def check_events():
"""响应按键和鼠标事件"""
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
def update_screen(ai_settings,screen,ship):
"""更新屏幕上的图像,并且换到新屏幕"""
#每次循环时重绘屏幕
screen.fill(ai_settings.bg_color)
ship.blitme()
#让最近绘制的屏幕可见
pygame.display.flip()