pygame飞机大战用精灵组(sprite)的层(layer)编写(八)BOSS要花样,更多花样(附代码资源下载链接)

BOSS能力强,想要更多花样,每次不再发射一颗子弹,要两颗,三颗,更多,更多

可以先看下我之前的日子 子弹的花样年华

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

发射方式的改变,只是发射点的不同,发射子弹的角度不同而已。

例如同时发射两颗子弹的实现方式

            interval = -self.rect.width // 4
            for v in range(0,2):
                bullet = BossBullet()
                bullet.set_bullet_type(bullettype)
                pos_x = boss_fire_pos.x - bullet.rect.width//2 + interval
                pos_y = boss_fire_pos.y
                bullet.set_pos(pos_x,pos_y)
                interval = self.rect.width //4

位置在左右1/4处,新建两颗子弹,计算位置,发射。

为了增加灵活性,在boss.py的fire()函数里增加两个参数,默认值均为零。

def fire(self, firetype=0, bullettype=0):

firetype 设置发射方式,单个、两个,多个等。bullettype 设置子弹类型,这里只是实现了图片的不同。

加了测试,随机产生发射方式和子弹类型,把boss.py改为如下代码:其他的文件依旧不用改。 

from setting import *
from animation import *
from lifebar import *
from bossbullet import *


class BossPlane(pygame.sprite.Sprite):
    def __init__(self):
        self._layer = 2
        self.groups = allgroup, bossgroup
        pygame.sprite.Sprite.__init__(self, self.groups)
        #设置飞机动态图像
        self.animation = Animation()
        self.images = self.animation.load_images('images/boss/', 0, 10, '.png')
        self.image = self.images[1]
        self.mask = pygame.mask.from_surface(self.image)
        # 飞机矩形
        self.rect = self.image.get_rect()
        self.bullet_speed = 4
        self.x_speed = 2
        self.y_speed = 2
        #默认移动方式
        self.motion_type = 1
        # 飞机子弹发射间隔 毫秒
        self.firetype = 0
        self.bullettype = 0
        self.interval = 500
        # 飞机子弹发射当前时间
        self.start_time = pygame.time.get_ticks()

        self.HP = 500
        self.HPFULL = 500
        lifebar = Lifebar(self)

    def update(self):
        # self.HP -= 1
        if self.HP <= 0:
            self.kill()
        #更新飞机当前图像
        if random.randint(0, 50) == 1:
            self.motion_type = random.randint(0, 1)
            self.x_speed = random.randint(-2, 3)
            self.y_speed = random.randint(-3, 2)
        self.image = self.animation.get_current_image()
        if self.motion_type == 0:
            if self.rect.x + self.rect.width > SCENEWIDTH or self.rect.x < 0:
                self.x_speed = -self.x_speed
            # self.rect.y += self.y_speed
            self.rect.x += self.x_speed
        elif self.motion_type == 1:
            if self.rect.x + self.rect.width > SCENEWIDTH or self.rect.x < 0:
                self.x_speed = -self.x_speed
            if self.rect.y + self.rect.height > SCENEHEIGHT or self.rect.y < 0:
                self.y_speed = -self.y_speed
            self.rect.x += self.x_speed
            self.rect.y += self.y_speed

        self.fire(random.randint(0,8),random.randint(0,12))

    def fire(self, firetype=0, bullettype=0):
        #时间判断,不到发射间隔,不射
        current_time = pygame.time.get_ticks()
        pass_time = current_time - self.start_time
        if pass_time < self.interval:
            return
        self.start_time = current_time
        self.firetype = firetype
        self.bullettype  = bullettype

        #boss 子弹的发射位置当然是下部中心
        boss_fire_pos = vect(self.rect.midbottom[0],self.rect.midbottom[1])
        #单颗子弹
        if firetype == 0:
            bullet = BossBullet()
            bullet.set_bullet_type(bullettype)
            pos_x = boss_fire_pos.x - bullet.rect.width // 2
            pos_y = boss_fire_pos.y
            bullet.set_pos(pos_x, pos_y)
        # 两个
        elif firetype == 1:
            interval = -self.rect.width // 4
            for v in range(0,2):
                bullet = BossBullet()
                bullet.set_bullet_type(bullettype)
                pos_x = boss_fire_pos.x - bullet.rect.width//2 + interval
                pos_y = boss_fire_pos.y
                bullet.set_pos(pos_x,pos_y)
                interval = self.rect.width //4
        #三个
        elif firetype == 2:
            interval = -self.rect.width // 4
            for v in range(0,3):
                bullet = BossBullet()
                bullet.set_bullet_type(bullettype)
                pos_x = boss_fire_pos.x - bullet.rect.width//2 + interval
                pos_y = boss_fire_pos.y
                bullet.set_pos(pos_x,pos_y)
                interval += self.rect.width //4
        # 向下30度角
        elif firetype == 3:
            for angle in range(75,106,10):
                bullet = BossBullet()
                bullet.set_bullet_type(bullettype)
                pos_x = boss_fire_pos.x
                pos_y = boss_fire_pos.y
                bullet.set_speed(self.bullet_speed,angle)
                bullet.set_pos(pos_x,pos_y)
        #向下 60度角
        elif firetype == 4:
            for angle in range(60,121,10):
                bullet = BossBullet()
                bullet.set_bullet_type(bullettype)
                pos_x = boss_fire_pos.x
                pos_y = boss_fire_pos.y
                bullet.set_speed(self.bullet_speed,angle)
                bullet.set_pos(pos_x,pos_y)
        #向下 90度角
        elif firetype ==5:
            for angle in range(45,136,10):
                bullet = BossBullet()
                bullet.set_bullet_type(bullettype)
                pos_x = boss_fire_pos.x
                pos_y = boss_fire_pos.y
                bullet.set_speed(self.bullet_speed,angle)
                bullet.set_pos(pos_x,pos_y)
        #向下 180度
        elif firetype ==6:
            for angle in range(0,181,10):
                bullet = BossBullet()
                bullet.set_bullet_type(bullettype)
                pos_x = boss_fire_pos.x
                pos_y = boss_fire_pos.y
                bullet.set_speed(self.bullet_speed,angle)
                bullet.set_pos(pos_x,pos_y)
        #360度
        elif firetype ==7:
            for angle in range(0,360,10):
                bullet = BossBullet()
                bullet.set_bullet_type(bullettype)
                pos_x = boss_fire_pos.x
                pos_y = boss_fire_pos.y
                bullet.set_speed(self.bullet_speed,angle)
                bullet.set_pos(pos_x,pos_y)
        #一顿乱射
        else:
            n = random.randint(10,50)
            for v in range(0,n):
                if random.randint(0,4) == 1:
                    bullet = BossBullet()
                    bullet.set_bullet_type(bullettype)
                    pos_x = boss_fire_pos.x - bullet.rect.width // 2
                    pos_y = boss_fire_pos.y
                    bullet.set_pos(pos_x+random.randint(-200,200), pos_y)

效果如下:

https://gitee.com/hailler/boss/tree/master  资源链接

猜你喜欢

转载自blog.csdn.net/hailler1119/article/details/88933362
今日推荐