extends CharacterBody2D @export_category("移动参数") @export var double_press_interval := 0.3 @export var move_speed: float = 75.0 @export var acceleration: float = 600.0 @export var deceleration: float = 800.0 @export var jump_velocity: float = -190.0 @onready var sprite: Sprite2D = $Sprite2D var flying : bool = false var last_space_press_time := -1000 func _physics_process(delta: float) -> void: if !flying: apply_gravity(delta) handle_jump() else: handle_vertical_movement(delta) handle_horizontal_movement(delta) update_sprite_direction() move_and_slide() func apply_gravity(delta: float) -> void: if not is_on_floor(): velocity += get_gravity() * delta func handle_vertical_movement(delta:float) -> void: var direction := Input.get_axis("squat", "jump") var target_speed := direction * jump_velocity if direction != 0.0: velocity.y = move_toward( velocity.y, target_speed, acceleration * delta ) else: velocity.y = move_toward( velocity.y, 0.0, acceleration * delta ) func handle_horizontal_movement(delta: float) -> void: var direction := Input.get_axis("move_left", "move_right") var target_speed := direction * move_speed if direction != 0.0: velocity.x = move_toward( velocity.x, target_speed, acceleration * delta ) else: velocity.x = move_toward( velocity.x, 0.0, deceleration * delta ) func handle_jump() -> void: if Input.is_action_just_pressed("jump") and is_on_floor(): velocity.y = jump_velocity func update_sprite_direction() -> void: if velocity.x != 0.0: sprite.flip_h = velocity.x < 0.0 func _unhandled_input(event: InputEvent) -> void: if event.is_action_pressed("fly") and !event.is_echo(): handle_space_pressed() if event.is_action_pressed("dash") and not is_dashing: start_dash() func handle_space_pressed() -> void: var current_time := Time.get_ticks_msec() var elapsed_time := current_time - last_space_press_time if elapsed_time <= double_press_interval * 1000.0: flying = not flying last_space_press_time = -1000 else: last_space_press_time = current_time signal died signal health_changed(current: int, max_hp: int) @export var max_hp: int = 3 @export var knockback_force: float = 150.0 var hp : int func _ready() -> void: hp = max_hp health_changed.emit(hp, max_hp) func take_damage(): hp -= 1 hp = max(hp, 0) health_changed.emit(hp, max_hp) apply_knockback() sprite.modulate = Color(1, 0, 0) # 变红 await get_tree().create_timer(0.5).timeout # 等 0.5 秒 sprite.modulate = Color(1, 1, 1) if hp <= 0: died.emit() queue_free() func apply_knockback(): # 取当前水平运动方向,反方向给速度 var dir = sign(velocity.x) # -1 或 1 if dir == 0: dir = -1 # 静止时默认往左击退 velocity.x = -dir * knockback_force velocity.y = -100 func _on_spikes_01_body_entered(body: Node2D) -> void: if body.has_method("take_damage"): body.take_damage() print("你受伤了,还剩",hp,"点血") # Replace with function body. func _on_spikes_03_body_entered(body: Node2D) -> void: if body.has_method("take_damage"): body.take_damage() print("你受伤了,还剩",hp,"点血") # Replace with function body. func _on_spikes_02_body_entered(body: Node2D) -> void: if body.has_method("take_damage"): body.take_damage() print("你受伤了,还剩",hp,"点血") # Replace with function body. func _on_spikes_05_body_entered(body: Node2D) -> void: if body.has_method("take_damage"): body.take_damage() print("你受伤了,还剩",hp,"点血") func _on_spikes_04_body_entered(body: Node2D) -> void: if body.has_method("take_damage"): body.take_damage() print("你受伤了,还剩",hp,"点血") signal coin_changed(total: int) # 金币变化时通知 UI var coins: int = 0 func add_coin(amount: int = 1) -> void: coins += amount coin_changed.emit(coins) print("金币:", coins) @export var dash_speed: float = 600.0 # 闪现速度 @export var dash_time: float = 0.1 # 持续时间(秒) var is_dashing := false func start_dash(): is_dashing = true # 朝当前面朝方向闪现 var dir = 1 if not sprite.flip_h else -1 velocity.x = dir * dash_speed velocity.y = 0 await get_tree().create_timer(dash_time).timeout velocity.x = 0 is_dashing = false func _on_spikes_06_body_entered(body: Node2D) -> void: if body.has_method("take_damage"): body.take_damage() print("你受伤了,还剩",hp,"点血")# Replace with function body. func _on_spikes_07_body_entered(body: Node2D) -> void: if body.has_method("take_damage"): body.take_damage() print("你受伤了,还剩",hp,"点血") # Replace with function body. func _on_spikes_08_body_entered(body: Node2D) -> void: if body.has_method("take_damage"): body.take_damage() print("你受伤了,还剩",hp,"点血") # Replace with function body.