D3/Char/Char_Components/Blood/blood_part.gd
2025-05-10 23:19:52 +08:00

114 lines
3.9 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends CharacterBody2D
var can_stain = false
# 所有可用的动画名称(方便后续添加新动画)
const AVAILABLE_ANIMATIONS = [
"impulse_1",
"impulse_2",
# 未来可以直接在这里添加新的动画名称
# "impulse_3",
# "impulse_4",
]
func _ready() -> void:
var anim_player = $AnimationPlayer
anim_player.speed_scale = randf_range(0.8,1.2)
# 确保有可用的动画
if AVAILABLE_ANIMATIONS.is_empty():
push_warning("没有可用的动画!")
queue_free()
return
# 随机选择一个动画名称
var random_index = randi() % AVAILABLE_ANIMATIONS.size()
var chosen_anim = AVAILABLE_ANIMATIONS[random_index]
# 验证动画是否存在
if not anim_player.has_animation(chosen_anim):
push_warning("动画 %s 不存在!" % chosen_anim)
queue_free()
return
# 播放选中的动画
anim_player.play(chosen_anim)
func _physics_process(_delta: float) -> void:
move_and_slide()
func spawn_random_effect() -> Node2D:
if not can_stain:
return
var pos = global_position
var dir = velocity.normalized()
var group_1: Array[PackedScene] = [
preload("res://Char/Char_Components/Blood/Art/blood_stain_1_01.tscn"),
preload("res://Char/Char_Components/Blood/Art/blood_stain_1_02.tscn"),
preload("res://Char/Char_Components/Blood/Art/blood_stain_1_03.tscn"),
preload("res://Char/Char_Components/Blood/Art/blood_stain_1_04.tscn"),
preload("res://Char/Char_Components/Blood/Art/blood_stain_1_05.tscn"),
preload("res://Char/Char_Components/Blood/Art/blood_stain_1_06.tscn"),
preload("res://Char/Char_Components/Blood/Art/blood_stain_1_07.tscn")
]
var group_2: Array[PackedScene] = [
preload("res://Char/Char_Components/Blood/Art/blood_stain_2_01.tscn"),
preload("res://Char/Char_Components/Blood/Art/blood_stain_2_02.tscn"),
preload("res://Char/Char_Components/Blood/Art/blood_stain_2_03.tscn"),
preload("res://Char/Char_Components/Blood/Art/blood_stain_2_04.tscn"),
preload("res://Char/Char_Components/Blood/Art/blood_stain_2_05.tscn"),
preload("res://Char/Char_Components/Blood/Art/blood_stain_2_06.tscn"),
preload("res://Char/Char_Components/Blood/Art/blood_stain_2_07.tscn"),
preload("res://Char/Char_Components/Blood/Art/blood_stain_2_08.tscn"),
preload("res://Char/Char_Components/Blood/Art/blood_stain_2_09.tscn"),
preload("res://Char/Char_Components/Blood/Art/blood_stain_2_10.tscn"),
preload("res://Char/Char_Components/Blood/Art/blood_stain_2_12.tscn"),
preload("res://Char/Char_Components/Blood/Art/blood_stain_2_11.tscn")
]
# 随机选择使用哪个组50%概率)
var selected_group: Array[PackedScene]
var is_group_1: bool = randf() < 0.5
selected_group = group_1 if is_group_1 else group_2
# 如果选中的组是空的,使用另一个组
if selected_group.is_empty():
selected_group = group_2 if is_group_1 else group_1
is_group_1 = !is_group_1
# 随机选择场景并实例化
var random_scene: PackedScene = selected_group[randi() % selected_group.size()]
var instance = random_scene.instantiate() as Node2D
if not instance:
push_error("Failed to instantiate scene!")
return null
# 设置位置
instance.global_position = pos
instance.self_modulate = Color.from_string("959595ca", Color.WHITE)
instance.z_index = 2
# 根据组别应用不同的变换
if is_group_1:
# 对group_1随机旋转
instance.rotation = randf_range(0, TAU) # TAU = 2π
#随机缩放
var random_scale = randf_range(1.1, 1.6)
instance.scale = Vector2(random_scale, random_scale)
else:
# 对group_2设置指定朝向
instance.transform = Transform2D(dir.angle(), pos)
#随机缩放
var random_scale = randf_range(0.8, 1)
instance.scale = Vector2(random_scale, random_scale)
# 添加到效果组
var effect_group = get_tree().get_first_node_in_group("Effect_Group")
if effect_group:
effect_group.add_child(instance)
else:
push_error("Effect_Group not found!")
instance.queue_free()
return null
return instance