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


    前言

    接上篇文章继续解绍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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    随机粒子类

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    源码获取

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

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

  • 相关阅读:
    java内存泄漏和内存溢出oom排查思路
    案例突破——再探策略模式
    XML详解--语法、DTD、schema
    分库分表索引设计:二级索引、全局索引的最佳设计实践
    C语言实现冒泡排序(超详细)
    R语言(3) 数据框操作
    安卓x86新生态破圈而来 强强组合大有可为
    关于网络协议的若干问题(五)
    信息化与信息系统4
    C嘎嘎之类和对象上
  • 原文地址:https://blog.csdn.net/fqfq123456/article/details/127943904