pygame飞机大战用精灵组(sprite)的层(layer)编写(五)BOSS想射,哦不,想发子弹了。

BOSS说,让我神经病一样飞来飞机去,还中了毒,存活不了几秒,在我离开舞台前,我想射,哦不,发几发子弹,表明我来过了。

好吧。

建立一个bullet.py,建立一个类。

层号稍微高级一点,设置成9 吧,子弹归属层allgropu和bulletgroup。 一个用来显示,一个用来碰撞检查。(bulletgroup不是很好,子弹有herobullet 和 enemybullet,这里是为了基类用的,后续BOSS会有自己的bossbulletgroup)

 具体的子弹方式,可以查看以前的日志,子弹系列。

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

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

介绍子弹的实现方式。

 

不多废话了,上改变后的Bullet代码。

"""
子弹的基类
设置坐标,速度,角度,计算更新后的点的坐标
"""
from setting import *
import math


class Bullet(pygame.sprite.Sprite):
    def __init__(self):
        self._layer = 9
        self.groups = allgroup,bulletgroup
        pygame.sprite.Sprite.__init__(self,self.groups)
        #必须要的两个初始化
        self.image = pygame.image.load('images/bullet/bulletdefault.png')
        self.rect = self.image.get_rect()
        #用vector来表述,清晰些,子弹的尺寸,用来飞机发射时的位置
        self.size = vect(self.rect.width, self.rect.height)
        #所有的运算都在主函数的scene里,
        # 所以要通过调用Bullet的类的scene,来获取主函数的scene
        # self.main_scene = scene
        #设置图像的mask属性,碰撞检查时,透明图像就忽略了
        self.mask = pygame.mask.from_surface(self.image)
        #设置默认的数据参数,速度
        self.speed = 4
        #笛卡尔坐标系,angle = 90 垂直向下
        self.angle = 90
        #初始距离和原点坐标
        self.distance = 0
        self.x_original = 0
        self.y_original = 0
        #伤害值
        self.damage = 1

    #继承至sprite,被sprite.Group()加入后,只要调用了sprite的update,这里也会自动调用
    def update(self):
        """计算图像位置
            先计算单位时间后的距离,通过三角运算,加上原始坐标,即为更新后坐标。
            想用pygame.time.get_fps()来计算时间,效果不好,直接写成了1000
        """
        #计算距离
        self.distance += 1000 * self.speed / 1000
        #degree 换成 radian 角度换弧度,用临时变量angle,保障self.angle不被变更
        angle = self.angle
        angle = math.pi * angle / 180
        #计算图像的左上角的x,y,三角函数换算加上原始点坐标
        self.rect.x = self.distance * math.cos(angle) + self.x_original
        self.rect.y = self.distance * math.sin(angle) + self.y_original
        # 用一条语句实现了跑出屏幕的检查,我真是佩服我自己
        # 如果子弹和屏幕不相碰,就表示在屏幕外了
        #kill()超出屏幕自动删除,从所有sprite组里删除
        if not self.rect.colliderect(SCENERECT):
            self.kill()

    #为了和飞机的位置配合,需要设置初始位置
    def set_pos(self, x, y):
        """设置位置
           x 左上方x坐标
           y 左上方y坐标
        """
        self.rect.x = x
        self.rect.y = y
        #rect.x,y会通过update更新,所以要记录原始点的坐标,用来计算更新后的坐标
        self.x_original = x
        self.y_original = y

    # 为了获取当前坐标,目前位置没用到
    def get_pos(self):
        """获取坐标,返回X,Y两个值
           x 左上方x坐标
           y 左上方y坐标
        """
        return (self.rect.x, self.rect.y)

    #设置速度、角度
    def set_speed(self, speed = 4, angle=0):
        """设置速度
        speed 速度,为X,Y两个方向的向量和
        angel 角度degree(不是弧度radian)
        """
        self.speed = speed
        self.angle = angle
    
    #设置图像,重新计算rect
    def set_image(self,image):
        """ 设置子弹的图像"""
        self.image = image
        self.rect = self.image.get_rect()
    
    #设置伤害值
    def set_damage(self,damage = 1):
        """ 设置子弹的伤害值 damage int
        """
        self.damage = damage

之所以写的这么复制,是考虑以后的换图片,多角度发射。

好了,发射一下试一试。

在boss.py里添加四行代码:

from Bullet import *

定义一个函数

def fire(self):

    bullet = Bullet()

在update()里添加

        self.fire()

哦,NO!!!射偏了!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值