1 玩家飞机类的属性
飞机大战游戏首先要设计的角色是玩家飞机,本小节介绍玩家飞机类涉及的属性。
实例属性中要设置一个游戏窗口属性,该属性在类初始化方法中设置。
玩家飞机将会展示一个飞机的图片,因此,需要一个image属性保存本地的正常状态的玩家飞机图片路径,根据这个路径加载图片。
玩家飞机可能会被敌机击毁,因此,为玩家飞机定义一组保存本地的玩家飞机爆炸图片路径的列表,根据这个列表中的路径加载图片,并作为玩家飞机类的属性。
玩家飞机有一个初始的位置,包含x坐标和y坐标,这也是玩家飞机类的两个属性。
玩家飞机类中定义一个子弹列表属性,用于存放子弹对象。
玩家飞机类中定义一个图片下标变量作为类的属性,用于控制逐帧将玩家飞机爆炸图片叠加到背景上。
玩家飞机类中定义一个标识玩家飞机是否爆炸的布尔变量作为类的属性。
玩家飞机类中定义一个碰撞列表属性,其中定义两个字典,设置碰撞有效区域。
创建玩家飞机类HeroPlan,类中定义玩家飞机的属性,代码如下:
- class HeroPlan():
- # 正常状态的玩家飞机图片
- image = ['./img/hero.gif', './img/hero2.png', './img/hero2.png']
- # 爆炸玩家飞机图片
- bomb_img = ['./img/hero_blowup_n1.png',
- './img/hero_blowup_n2.png',
- './img/hero_blowup_n3.png',
- './img/hero_blowup_n4.png']
- x = 190 # 初始位置x轴坐标
- y = 528 # 初始位置y轴坐标
- biu_list = [] # 玩家飞机子弹列表
- img_index = 0 # 图片下标
- is_bomb = False # 标识玩家飞机是否爆炸
- # 碰撞有效区域[{范围1}, {范围2}]
- blast = [{'x': (35, 65), 'y': (0, 40)}, {'x': (0, 100), 'y': (40, 100)}]
2 玩家飞机类的方法
首先定义玩家飞机类的初始化方法,将全局定义的游戏窗口变量赋值给类的实例属性,代码如下:
- def __init__(self, surface):
- self.surface = surface
玩家飞机类中包含以下方法。
(1)hero_display()方法
玩家飞机类中第一个重要方法为hero_display()。该方法的主要功能是在游戏窗口上绘制玩家飞机。
该方法中首先检测一个玩家飞机是否爆炸实例属性is_bomb。如果玩家飞机没有被击中,即值为False,那么在设定的坐标位置加载正常状态的玩家飞机图片,并绘制到游戏窗口上。如果玩家飞机被敌机击中,即值为True,那么先检测爆炸玩家飞机图片是否显示到最后一张,若显示到最后一张,则调用结束画面并退出游戏,否则根据bomb_img中保存的图片路径逐一加载图片。由于bomb_img是一个列表,保存了玩家飞机爆炸动画的一系列图片的本地链接,因此需要一个img_index,游戏循环更新时,根据img_index加载合适的图片,并叠加到游戏窗口中。
hero_display()方法中还有一个处理子弹的for循环。biu_list列表中没有项时,就不执行这个for循环。如果玩家按下空格键,并且biu_list列表中有项时,在游戏窗口上显示子弹图片,然后移动子弹图片,产生发射子弹的效果。当子弹图片移动超过了游戏窗口时,删除biu_list列表中的所有项。
hero_display()方法在游戏循环中更新,绘制出玩家飞机和子弹,以及玩家飞机被击中后所执行的一系列操作。
hero_display()方法的代码如下:
- def hero_display(self):
- # 检查玩家飞机是否爆炸
- if self.is_bomb == False:
- self.surface.blit(pygame.image.load(self.image[self.img_index]), (self.x, self.y))
- else:
- time.sleep(0.5)
- if self.img_index == len(self.bomb_img):
- end_screen_us()
- exit('游戏结束')
- self.surface.blit(pygame.image.load(self.bomb_img[self.img_index]), (self.x, self.y))
- self.img_index += 1 # 用于显示图片
- for biu in self.biu_list: # 在绘制完玩家飞机后,再绘制子弹
- biu.biu_diplay() # 绘制子弹到游戏窗口
- biu.move_up() # 移动子弹
- # 超出游戏窗口则删除越界子弹
- self.biu_list.remove(biu) if biu.y < 0 else ''
(2)fire()方法
fire()方法先创建子弹实例,再将这个实例存入biu_list列表之中。biu_list作为玩家飞机类的实例属性,在hero_display()方法中被使用。
fire()方法的代码如下:
- def fire(self):
- # 存一颗子弹进入子弹列表
- self.biu_list.append(Biu(self.surface, self.x, self.y))
(3)move_right()方法
move_right()方法对玩家飞机精灵的x坐标进行修改,对当前x坐标增加10,即右移,并限制玩家飞机的移动范围,使其不能移出游戏窗口的右边界。
move_right()方法的代码如下:
- # 玩家飞机右移
- def move_right(self):
- # 限制玩家飞机的移动范围
- if self.x < 380:
- self.x += 10
(4)move_left()方法
move_left()方法对玩家飞机精灵的x坐标进行修改,对当前x坐标减少10,即左移,并限制玩家飞机的移动范围,使其不能移出游戏窗口的左边界。
move_left()方法的代码如下:
- # 玩家飞机左移
- def move_left(self):
- # 限制玩家飞机的移动范围
- if self.x > 0:
- self.x -= 10
(5)bomb()方法
bomb()方法是玩家飞机被击中后调用的方法。该方法设置玩家飞机类的实例属性img_index为0;还设置玩家飞机类的实例属性is_bomb为True,用于标识玩家飞机被击中爆炸了。
bomb()方法的代码如下:
- def bomb(self):
- self.img_index = 0
- self.is_bomb = True