Files
sijcdu 81ffe989f6 Add a level 2 scaffold and make the level-clear screen load the next level
level_clear.gd gained a next_level_scene export: empty reloads the current level, otherwise it changes to the given scene. Level 1 now points at res://scenes/level_2.tscn. level_2.tscn is an empty but complete level: background, three TileMapLayers wired to the same TileSet, player, HUD, death screen and level-clear screen, plus the empty prefab containers. Its hidden_passages script explicitly sets hidden_cells = [] so level 1's passage cells are not carved here.
2026-10-07 21:10:25 +08:00

79 lines
2.3 KiB
GDScript

extends CanvasLayer
## 过关界面:集齐钻石后碰到门显示。
## 显示时把整棵树暂停,所以这一层的 process_mode 设成 ALWAYS(见 .tscn),
## 不然暂停后自己的动画和按钮也会停。
@export var fade_time: float = 0.8
@export var button_delay: float = 0.3
## 点「进入下一关」时加载哪个场景。
## 留空 = 重新加载本关;填 res://scenes/level_2.tscn 之类就跳到下一关。
@export_file("*.tscn") var next_level_scene: String = ""
var _fade: ColorRect = null
var _center: CenterContainer = null
var _button: Button = null
var _title: Label = null
var _subtitle: Label = null
var _elapsed: float = 0.0
var _showing: 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/NextButton")
_title = get_node_or_null("Center/VBox/Title")
_subtitle = get_node_or_null("Center/VBox/Subtitle")
if _button != null:
_button.pressed.connect(next_level)
if _fade != null:
_fade.color = Color(0.0, 0.0, 0.0, 0.0)
if _center != null:
_center.visible = false
if next_level_scene.is_empty() and _button != null:
_button.text = "重新开始 (R)"
func show_clear() -> void:
if _showing:
return
_showing = true
visible = true
_elapsed = 0.0
if _title != null:
_title.text = "过关!"
if _subtitle != null:
var player := get_tree().get_first_node_in_group("player")
var n: int = 0 if player == null else int(player.diamonds)
_subtitle.text = "钻石 %d / %d" % [n, n]
get_tree().paused = true
func _process(delta: float) -> void:
if not _showing:
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 _showing:
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:
next_level()
func next_level() -> void:
get_tree().paused = false
if next_level_scene.is_empty():
get_tree().reload_current_scene()
else:
get_tree().change_scene_to_file(next_level_scene)