前言
接上篇文章继续解绍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
查看评论