小言_互联网的博客

小学生python游戏编程arcade----爆炸粒子类

340人阅读  评论(0)

前言

接上篇文章继续解绍arcade游戏编程的基本知识。爆炸粒子类,爆炸效果由两部分随成

1.1 参数设置

粒子加速下降的速度。如果不需要,则为0

PARTICLE_gravity = 0.05

粒子退出的速度

PARTICLE_fade_rate = 8

粒子移动的速度。范围为2.5<–>5,设置为2.5和2.5。

PARTICLE_min_speed = 2.5
PARTICLE_speed_range = 2.5

每次爆炸有多少粒子

PARTICLE_count = 20

粒子直径多大

PARTICLE_RADIUS = 3

粒子颜色列表

PARTICLE_colors = [arcade.color.ALIZARIN_CRIMSON,
arcade.color.COQUELICOT,
arcade.color.LAVA,
arcade.color.KU_CRIMSON,
arcade.color.DARK_TANGERINE]

我们有可能将纹理翻转为白色,使其“闪闪发光”

PARTICLE_sparkle_chance = 0.02

#注意:添加烟雾轨迹会产生大量精灵,并会减慢速度
#向下。如果你想要很多,就需要将处理转移到GPU
#使用变换反馈。如果要慢下来,就把烟除掉。

开始烟雾缩放,缩放速度有多快

SMOKE_start_scale = 0.25
SMOKE_EXPANSION_RATE = 0.03

#烟雾消退和上升的速率
SMOKE_FADE_RATE = 7
SMOKE_RISE_RATE = 0.5

随机小烟雾值

SMOKE_chance = 0.25

烟雾类

class Smoke(arcade.SpriteCircle):
    """ 烟雾"""
    def __init__(self, size):
        super().__init__(size, arcade.color.LIGHT_GRAY, soft=True)
        self.change_y = SMOKE_RISE_RATE
        self.scale = SMOKE_start_scale

    def update(self):
        """ 更新粒子 """
        if self.alpha <= PARTICLE_fade_rate:
            # 移除淡出的粒子
            self.remove_from_sprite_lists()
        else:
            # 更新粒子
            self.alpha -= SMOKE_FADE_RATE
            self.center_x += self.change_x
            self.center_y += self.change_y
            self.scale += SMOKE_EXPANSION_RATE

随机粒子类

class Particle(arcade.SpriteCircle):
    """ 爆炸粒子"""
    def __init__(self, my_list):
        # 随机颜色
        color = random.choice(PARTICLE_colors)

        # 制造粒子
        super().__init__(PARTICLE_RADIUS, color)

        # 跟踪正常的粒子纹理,这样我们可以在闪耀时“翻转”。
        self.normal_texture = self.texture

        # 跟踪我们的列表,这样我们就可以添加烟雾痕迹
        self.my_list = my_list

        # 设置方向及速度
        speed = random.random() * PARTICLE_speed_range + PARTICLE_min_speed
        direction = random.randrange(360)
        self.change_x = math.sin(math.radians(direction)) * speed
        self.change_y = math.cos(math.radians(direction)) * speed

        # 跟踪原始alpha。用作“火花”的一部分,我们在其中临时设置alpha返回到255
        self.my_alpha = 255

    def update(self):
        """ 更新粒子 """
        if self.my_alpha <= PARTICLE_fade_rate:
            # 淡出
            self.remove_from_sprite_lists()
        else:
            # 更新
            self.my_alpha -= PARTICLE_fade_rate
            self.alpha = self.my_alpha
            self.center_x += self.change_x
            self.center_y += self.change_y
            self.change_y -= PARTICLE_gravity

            # Should we sparkle this?
            if random.random() <= PARTICLE_sparkle_chance:
                self.alpha = 255
                self.texture = arcade.make_circle_texture(int(self.width),
                                                          arcade.color.WHITE)
            else:
                self.texture = self.normal_texture

            # 随机小烟雾颗粒
            if random.random() <= SMOKE_chance:
                smoke = Smoke(5)
                smoke.position = self.position
                self.my_list.append(smoke)


1.3 效果图

1.4 代码实现

    def update_explosion(self):
        self.explosions_list.update()

        # 循环子弹列表
        for bullet in self.scene[LAYER_bullet]:

            # 碰撞检测
            hit_list = arcade.check_for_collision_with_list(bullet,  self.scene['建筑物'])

            if len(hit_list) > 0:
                bullet.remove_from_sprite_lists()

            # 如碰撞,则让敌人消失,同时制造粒子
            for coin in hit_list:
                # 制造爆炸
                for i in range(20):
                    particle = Particle(self.explosions_list)
                    particle.position = coin.position # 粒子位置,也即敌人位置
                    self.explosions_list.append(particle)

                smoke = Smoke(30)
                smoke.position = coin.position  # 烟雾位置
                self.explosions_list.append(smoke)

                coin.remove_from_sprite_lists()

                # 打击声音
                arcade.sound.play_sound(self.hit_sound)

            # 如过子弹超过屏幕则删掉.
            if bullet.bottom > SCREEN_height:
                bullet.remove_from_sprite_lists()

源码获取

关注博主后,私聊博主免费获取
需要技术指导,育娃新思考,企业软件合作等更多服务请联系博主

今天是以此模板持续更新此育儿专栏的第 24/50次。
可以关注我,点赞我、评论我、收藏我啦。


转载:https://blog.csdn.net/fqfq123456/article/details/127943904
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场