Files
sijcdu 9dffacd938 Initial commit: Godot 4.7 pixel platformer prototype
Player: move/jump (Space), test flight (F, debug builds only). Key: pickup, hold S to aim with live trajectory preview, release to throw, W to warp to the thrown key. Spring bounce. Spikes deal damage. 3-heart health, Z consumes a heal item for +1 heart and a 5s shield. HUD with hearts and item count. Death screen with fade-to-black and restart. Hidden passages. Assets: Kenney Pixel Platformer (CC0).
2026-10-07 20:32:42 +08:00

65 lines
1.6 KiB
GDScript

extends CanvasLayer
## 生命值归零后的死亡界面:画面渐黑 + 重新开始按钮。
## 只负责显示和重启,死亡状态由玩家(is_dead)决定。
signal restart_requested
@export var fade_time: float = 1.0
## 渐黑完成后再过多久显示标题和按钮
@export var button_delay: float = 0.4
var _player: Node = null
var _fade: ColorRect = null
var _center: CenterContainer = null
var _button: Button = null
var _elapsed: float = 0.0
var _dying: bool = false
func _ready() -> void:
visible = false
_fade = get_node_or_null("Fade")
_center = get_node_or_null("Center")
_button = get_node_or_null("Center/VBox/RestartButton")
if _button != null:
_button.pressed.connect(restart)
if _fade != null:
_fade.color = Color(0.0, 0.0, 0.0, 0.0)
if _center != null:
_center.visible = false
func _process(delta: float) -> void:
if not _dying:
if _player == null or not is_instance_valid(_player):
_player = get_tree().get_first_node_in_group("player")
if _player == null:
return
if bool(_player.is_dead):
_dying = true
visible = true
else:
return
_elapsed += delta
if _fade != null:
_fade.color = Color(0.0, 0.0, 0.0, clampf(_elapsed / maxf(fade_time, 0.01), 0.0, 1.0))
if _center != null and _elapsed >= fade_time + button_delay:
_center.visible = true
func _unhandled_input(event: InputEvent) -> void:
if not _dying:
return
var key := event as InputEventKey
if key != null and key.pressed and not key.echo:
if key.physical_keycode == KEY_R or key.physical_keycode == KEY_ENTER:
restart()
func restart() -> void:
restart_requested.emit()
get_tree().paused = false
get_tree().reload_current_scene()