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).
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user