pygame飞机大战用精灵组(sprite)的层(layer)编写(八)BOSS要花样,更多花样(附代码资源下载链接)
BOSS能力强,想要更多花样,每次不再发射一颗子弹,要两颗,三颗,更多,更多
可以先看下我之前的日子 子弹的花样年华
https://blog.****.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 资源链接