pygame飞机大战用精灵组(sprite)的层(layer)编写(十)BOSS说,你别乱跑,我要瞄准了射

烧早饭了。。。

有了层以后,好像一切都变简单了,main.py里很好要添加代码,各个类之间的数据传递,可以通过层来实现。

感觉从家用机时代进入了大数据时代,方便的让人不敢相信。

代码晚上再写。

原理很简单,详见之前我的日志。

https://blog.csdn.net/hailler1119/article/details/88753065

改变几条语句就能用了,代码如下:

from setting import *


class Missle(pygame.sprite.Sprite):
    def __init__(self, group):
        self._layer = 5
        self.groups = allgroup,group
        pygame.sprite.Sprite.__init__(self,self.groups)
        #必不可少的两条代码
        self.image = pygame.image.load('images/missle/missle0.png')
        self.rect = self.image.get_rect()
        #初设速度、角度
        self.x_speed = 0.00
        self.y_speed = 2.00
        self.speed = 6
        self.damage = 3
        self.angle = 0
        # 初始化阶段赋值,以后这个original图片坐标、方向都是不变的,self.image是变化的。
        # sprite 显示的是self.image
        self.original = self.image

    #会自动调用
    def update(self):
        """更新导弹位置
           旋转图像,计算x,y方向速度
           计算更新后的坐标点
           超出屏幕自动从所有精灵组删除
        """
        #记录原有中心,复杂转换的图像,转换后中心为原中心
        original_center = self.rect.center
        #rotate后,original还是保持不变的,包括角度和坐标点,变的是self.image
        #self.image得到的是转变后的图像和图像的坐标,该坐标是(0,0,width,height)转角度angle后的坐标
        #不是当前位置的坐标。所以还得给转变后的图像的坐标重新赋值。导弹图像的头是向下的,要90-angle
        self.image = pygame.transform.rotate(self.original, 90-self.angle)
        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.sin(angle)
        self.rect.x += self.x_speed
        self.rect.y += self.y_speed
        #当目标在导弹到达之前没了,改何去何从??
        #在主函数里,寻找下一个目标,如果没目标,往太空飞,飞出屏幕后自毁
        if not self.rect.colliderect(SCENERECT):
            self.kill()

    def set_target_coordinate(self, target_xy):
        """ 设置打击目标的坐标点
            target_xy   用Vector2建立,例如 target_xy = pygame.math.Vector2(200,400)
            取得自身坐标,取得目标坐标,计算向量差,计算从原点到向量差的点的这角度
            赋值给self.angle,该值单位 degree
        """
        pos0 = vect(0, 0)
        pos1 = vect(self.rect.centerx, self.rect.centery)
        pos2 = target_xy
        pos21 = pos2 - pos1
        self.angle = pos0.angle_to(pos21)

    #为了和飞机的位置配合,需要设置初始位置
    def set_pos(self, x, y):
        self.rect.x = x
        self.rect.y = y


    def set_speed(self, speed, angle=0):
        """ 设置速度、角度
            speed 速度
            angle 角度
            用三角函数计算x,y两个方向的度数
        """
        self.speed = speed
        self.angle = angle
        angle = math.pi * angle / 180
        self.x_speed = speed * math.cos(angle)
        self.y_speed = speed * math.sin(angle)

在setting.py添加

bossmisslegroup = pygame.sprite.Group()

把missle放到allgroup里显示用,放到 bossmisslegroup里做碰撞检查用。

在boss.py里添加一个函数

def fire_missle(self,firetype=0, missletype=0,interval = 500):
        self.interval = interval
        current_time = pygame.time.get_ticks()
        pass_time = current_time - self.start_time
        if pass_time < self.interval:
            return
        self.start_time = current_time
       
        for hero in herogroup:

            missle = Missle()
            hero_pos= vect(hero.rect.centerx,hero.rect.centery)
            boss_fire_pos = vect(self.rect.midbottom[0],self.rect.midbottom[1]-100)
            pos_x = boss_fire_pos.x - missle.rect.width // 2
            pos_y = boss_fire_pos.y
            missle.set_pos(pos_x, pos_y)
            missle.set_target_coordinate(hero_pos)

默认发射间隔和子弹间隔一样,还是有点不合理,可以单独再设置一个missleinteral来区分。

在update()函数里,为了看清效果,把fire()先关了,添加:

self.fire_missle()

效果如下图

猜你喜欢

转载自blog.csdn.net/hailler1119/article/details/88940293