114 lines
3.9 KiB
GDScript
114 lines
3.9 KiB
GDScript
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
|