A Minecraft style clone in Godot
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

87 lines
2.6 KiB

## Handle changing changing menus and running the show/hide animations for each menu.
## Each menu should extend BaseMenu
class_name PauseMenu
extends Panel
signal open_menu(menu_name: String)
@onready var menu_mapping: Dictionary[String, BaseMenu] = {
"MainMenu": $MainMenu,
"SettingsMenu": $SettingsMenu,
"SavesMenu": $SavesMenu,
}
var _active_menu: String = "MainMenu"
var _next_menu: String = ""
func _ready() -> void:
open_menu.connect(_on_change_menu)
for menu: BaseMenu in get_children():
menu.animation_player.animation_finished.connect(_on_animation_finished)
menu.pause_menu = self
menu.init()
SaveGameManager.create_save.connect(_on_create_save)
SaveGameManager.load_save.connect(_on_load_save)
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("ui_cancel") and !visible:
_open_pause_menu()
elif event.is_action_pressed("ui_cancel") and visible and _active_menu == "MainMenu":
menu_mapping["MainMenu"].animation_player.play("hide")
elif event.is_action_pressed("ui_cancel"): ## Always back out to the MainMenu - Future, maybe add _previous_menu to allow backing out to any menu
open_menu.emit("MainMenu")
## Start the `hide` animation for the current menu.
## The `show` animation will play after the `hide` has completed, from `_on_animation_finished()`.
func _change_menu(menu_name: String) -> void:
visible = true
_next_menu = menu_name
if _next_menu == "":
menu_mapping["MainMenu"].animation_player.play("hide")
else:
menu_mapping[_active_menu].animation_player.play("hide")
func _close_pause_menu() -> void:
visible = false
_next_menu = ""
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
SignalManager.resume_game.emit()
## Run the `show` animation for the next menu
## If there is no next menu, close the pause menu
func _handle_next_menu() -> void:
if _next_menu == "":
_active_menu = "MainMenu"
_close_pause_menu()
else:
_active_menu = _next_menu
_next_menu = ""
menu_mapping[_active_menu].animation_player.play("show")
func _open_pause_menu() -> void:
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
SignalManager.pause_game.emit()
menu_mapping["MainMenu"].animation_player.play("show")
## When the hide animation finished, start show `show` animation for the next menu
func _on_animation_finished(animation_name: String) -> void:
if animation_name == "hide":
_handle_next_menu()
func _on_change_menu(menu_name: String) -> void:
_change_menu(menu_name)
func _on_create_save(_save: String) -> void:
menu_mapping["SavesMenu"].reset_menu()
_close_pause_menu()
func _on_load_save(_save: String) -> void:
menu_mapping["SavesMenu"].reset_menu()
_close_pause_menu()