目标,显示英雄飞机的得分,生命值,BOSS机的动态生命条
战斗界面中,信息数据是必不可少的,一般都包括得分值,当遇到BOSS时,还会显示BOSS的动态生命条,还有其他的飞机数量,炸弹数量等。不管生命信息,原理都是一样的。
假设你有一个BOSS类,继承于pygame.sprite.Sprite,BOSS有HP值属性。
还有英雄飞机,继承于pygame.sprite.Sprite,属性里有得分和生命。
显示信息一般在主类里,用 pygame.Surface.blit()来绘制,在主类里面取得所需的HP值,得分,生命。用类似
# 绘制玩家信息
hero_info = self.my_font.render('score:' + str(self.hero_score), True,
(255, 0, 0))
hero_life = self.my_font.render("生命:" + str(self.hero.HP), True,
(0, 255, 0))
self.scene.blit(hero_info, (0, 0))
self.scene.blit(hero_life, (self.size[0] - 100, 0))
这样的方法在屏幕显示。
但是当显示的信息是多样化,列如要显示BOSS的生命条,要显示小BOSS的生命条,生命条要随飞机移动,要显示伤害值等等数据或者图像的时候,在主函数里就显得不大方便了,管理起来很麻烦。
其实可以在每个sprite里设置各自的显示方式,对自己的显示方式进行自己管理。
pygame.sprite.Group()里的draw函数,只能显示sprite,不能对在sprite里的其他图像进行显示。所以还得在主类里添加显示的代码。
例如在boss类里添加自己的绘制函数例如draw_life_indicate(self),在函数里,对BOSS的生命进行计算,绘制生命条,设置显示位置等操作。
在主函数里只需添加一行代码就行了。
列如在BOSS里中添加draw_life_indicate(self)函数 初设HP为100,所以剩下的比例为 self.HP/100
当半血以上时,用绿色条显示生命值,当小于半血时,用红色,当小于等于零时,自毁。
def draw_life_indicate(self):
hp_remain = self.HP/100
if self.HP <= 0:
self.kill()
if hp_remain > 0.50:
# print(hp_remain)
pygame.draw.line(self.main_scene, (0, 255, 0),
(200, 0), (200+300*hp_remain, 0), 30)
else:
self.motion_type = 1
pygame.draw.line(self.main_scene, (255, 0, 0),
(200, 0), (200+300*hp_remain, 0), 30)
在主函数里添加:
if self.boss_sprite:
for boss in self.boss_sprite:
#显示BOSS的生命条。
boss.draw_life_indicate()
其中self.boss_sprite= pygame.sprite.Group()或者
self.boss_sprite = pygame.sprite.RenderUpdates()
RenderUpdates(Group)继承至Group,强化了一下他的draw()函数,对变化的图像进行重新绘制,不变化的不绘制,提高运行速度,静态画面多的游戏里使用,可以提高游戏性能。飞机大战这种几乎都在动的游戏,没提升。