BOSS瞄准了半天发射,可都被英雄躲过去了,心里不爽,看到电商的广告,感觉5G是个好东西,先搞个自动导航吧。
其实在上一篇中的millse类已经具有导航功能了,5G手机已经有了,差的是信号,那么现在加入信号。
在 boss.py的fire_missle()函数的最前面,在发射导弹前,先判断是否已经有导弹了,如果有了,那么让重新定位就行
for hero in herogroup:
hero_pos = vect(hero.rect.centerx, hero.rect.centery)
for gmissle in bossmisslegroup:
gmissle.set_target_coordinate(hero_pos)
这么一来,屏幕上所有的导弹就跟着英雄飞机的心脏走了。
不过跟踪导弹也想实现动态图片,pygame的图片旋转功能有点麻烦,动态图的旋转就涉及到多张图片的旋转,需要多张图片的原始图。因此要新建一个类来实现。该类继承至Missle,完整代码如下
from setting import *
from animation import *
from missle import *
class GuidedMissle(Missle):
# class GuidedMissle(pygame.sprite.Sprite):
def __init__(self,group):
self._layer = 5
self.groups = allgroup,group
pygame.sprite.Sprite.__init__(self,self.groups)
self.animation = Animation()
self.images = self.animation.load_image('images/missle/gmissle.png',
60, 93, 1, 2)
#必不可少的两条代码
self.image = self.images[0].convert_alpha()
self.rect = self.image.get_rect()
#初设速度、角度
self.x_speed = 0.00
self.y_speed = 2.00
self.speed = 5
self.damage = 3
self.angle = 0
# 初始化阶段赋值,以后这个original图片坐标、方向都是不变的,self.image是变化的。
# sprite 显示的是self.image
self.original = self.image.convert_alpha()
def update(self):
"""更新导弹位置
旋转图像,计算x,y方向速度
计算更新后的坐标点
超出屏幕自动从所有精灵组删除
"""
self.original = self.animation.get_current_image()
#记录原有中心,复杂转换的图像,转换后中心为原中心
original_center = self.rect.center
#rotate后,original还是保持不变的,包括角度和坐标点,变的是self.image
#self.image得到的是转变后的图像和图像的坐标,该坐标是(0,0,width,height)转角度angle后的坐标
#不是当前位置的坐标。所以还得给转变后的图像的坐标重新赋值。
self.image = pygame.transform.rotate(self.original, 90 - self.angle).convert_alpha()
self.rect.center = original_center
self.mask = pygame.mask.from_surface(self.image)
#用临时变量来进行degree和 radian 之间的转换
angle = self.angle * math.pi / 180
self.x_speed = self.speed * math.cos(angle)
self.y_speed = self.speed * math