作者:雷蕾
在经过创建Pygame窗口及响应用户输入、设置背景颜色和创建存储所有新功能的类后,我们要在《外星人入侵》小游戏中添加飞船图像啦~
在进行添加飞船图像时,我们要注意将飞船图像保存在与主程序文件的同一文件夹下,也可在与主程序文件的同一文件夹下新建一个名为images的文件夹,用以保存飞船图像。
选择用于表示飞船的图像后,接下来的任务就是将飞船图像能够成功显示在屏幕上。
import pygame
class Ship:
'''管理飞船的类'''
def __init__(self,ai_game):
'''初始化飞船并设置其初始位置'''
self.screen=ai_game.screen
self.screen_rect=ai_game.screen.get_rect()
#加载飞船图像并获取其外接矩形
self.image=pygame.image.load('images/ship.bmp')
self.rect=self.image.get_rect()
#对于每艘新飞船,都将其放在屏幕底部的中央
self.rect.midbottom=self.screen_rect.midbottom
def blitme(self):
'''在指定位置绘制飞船'''
self.screen.blit(self.image,self.rect)
在这个示例中,定义类Ship之前,我们先导入Pygame模块。
在类Ship中的方法__init__()接受了两个参数(形参):引用self和指向主程序文件中类AlienInvasion实例的引用(让Ship能够访问AlienInvasion中定义的所有资源)
代码行 self.screen=ai_game.screen中将屏幕赋给了Ship的一个属性,以便在这个类的所有方法能够轻松访问。
代码行self.screen_rect=ai_game.screen.get_rect()使用方法get_rect()访问屏幕的属性rect,并将其赋给了self.screen_rect,这是能够让我们知道飞船放在屏幕中的正确位置。
rect对象
是Pygame能够像
处理矩形
一样处理所有的游戏元素,即使它的形状并不是矩形的,在示例中Pygame将游戏元素视为矩形。
代码行self.image=pygame.image.load(‘images/ship.bmp’)是调用pygame.image.load()加载图像,将飞船图像位置传递给它,图像位置位于文件夹images下,文件名为’ship.bmp’。该函数返回一个表示飞船的surface,在示例中将surface赋给变量 self.image。
代码行 self.rect=self.image.get_rect()是加载图像之后,使用get_rect()获取相应surface的属性rect,以便以后能够用它来指定飞船的位置。
代码行 self.rect.midbottom=self.screen_rect.midbottom是将飞船图像放在屏幕底部的中央,将 self.rect.midbottom设置为表示屏幕的矩形的属性midbottom。
在Pygame中使用rect属性来放置飞船图像,在要指定矩形位置时,如果要让游戏元素居中,可设置相应rect对象的属性:center、centerx、centery。
要让游戏元素与屏幕边缘对齐,可设置相应rect对象的属性:top、bottom、left、right。
除此之外还有一些组合属性:midbottom、midtop、midleft和midright。
代码行 def blitme(self)是定义了方法blitme(),该方法可将图像绘制到self.rect指定的位置。
由于添加了要添加图像飞船的类Ship,并且要在主程序文件中导入类Ship,我们对之前的主程序文件进行更新:
import sys
import pygame
from settings import Settings
from ship import Ship
class AlienInvasion:
'''管理资源和行为的类'''
def __init__(self):
'''初始化游戏并创建游戏资源'''
pygame.init()
self.settings=Settings()
self.screen=pygame.display.set_mode(
(self.settings.screen_width,self.settings.screen_height))
pygame.display.set_caption("AlienInvasion")
self.ship=Ship(self)
def run_game(self):
'''开始游戏的主循环'''
while True:
#监视键盘和鼠标
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
#每次循环时都重绘屏幕
self.screen.fill(self.settings.bg_color )
self.ship.blitme()
#让最近绘制的屏幕可见
pygame.display.flip()
if __name__=='__main__':
#创建游戏实例并运行游戏
ai=AlienInvasion()
ai.run_game()
添加的代码行 self.ship=Ship(self)是创建了一个Ship实例,当调用Ship()时,必须提供一个参数:一个 AlienInvasion实例。在示例中,self指向的是当前 AlienInvasion实例,这个参数让Ship能够访问游戏资源,将实例Ship赋给了 self.ship。
添加的代码行self.ship.blitme()是调用ship.blitme()将飞船绘制到屏幕上,并确保它出现在背景前面。
运行主程序文件:
可以看到飞船图像位于屏幕底部中央。