烧早饭了。。。
有了层以后,好像一切都变简单了,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()
效果如下图