9dffacd938
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).
65 lines
1.6 KiB
GDScript
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()
|