第一次提交作业
This commit is contained in:
@@ -0,0 +1,195 @@
|
||||
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.
|
||||
Reference in New Issue
Block a user