81ffe989f6
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.
79 lines
2.3 KiB
GDScript
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)
|