Skip to content

Commit eac2d28

Browse files
authored
Merge pull request #340 from Maaack/refactor-main-menus
Refactor main menus, adding signals and flags
2 parents 6dcabc2 + 374f238 commit eac2d28

File tree

7 files changed

+204
-14
lines changed

7 files changed

+204
-14
lines changed

addons/maaacks_game_template/base/scenes/menus/main_menu/main_menu.gd

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,60 @@
11
class_name MainMenu
22
extends Control
33

4+
signal sub_menu_opened
5+
signal sub_menu_closed
6+
signal game_started
7+
signal game_exited
8+
49
## Defines the path to the game scene. Hides the play button if empty.
510
@export_file("*.tscn") var game_scene_path : String
611
@export var options_packed_scene : PackedScene
712
@export var credits_packed_scene : PackedScene
13+
@export_group("Extra Settings")
14+
@export var signal_game_start : bool = false
15+
@export var signal_game_exit : bool = false
816

917
var options_scene
1018
var credits_scene
1119
var sub_menu
1220

1321
func load_game_scene() -> void:
14-
SceneLoader.load_scene(game_scene_path)
22+
if signal_game_start:
23+
SceneLoader.load_scene(game_scene_path, true)
24+
game_started.emit()
25+
else:
26+
SceneLoader.load_scene(game_scene_path)
1527

1628
func new_game() -> void:
1729
load_game_scene()
1830

31+
func exit_game() -> void:
32+
if signal_game_exit:
33+
game_exited.emit()
34+
else:
35+
get_tree().quit()
36+
37+
func _hide_menu() -> void:
38+
%BackButton.show()
39+
%MenuContainer.hide()
40+
41+
func _show_menu() -> void:
42+
%BackButton.hide()
43+
%MenuContainer.show()
44+
1945
func _open_sub_menu(menu : Control) -> void:
2046
sub_menu = menu
2147
sub_menu.show()
22-
%BackButton.show()
23-
%MenuContainer.hide()
48+
_hide_menu()
49+
sub_menu_opened.emit()
2450

2551
func _close_sub_menu() -> void:
2652
if sub_menu == null:
2753
return
2854
sub_menu.hide()
2955
sub_menu = null
30-
%BackButton.hide()
31-
%MenuContainer.show()
56+
_show_menu()
57+
sub_menu_closed.emit()
3258

3359
func _event_is_mouse_button_released(event : InputEvent) -> bool:
3460
return event is InputEventMouseButton and not event.is_pressed()
@@ -84,7 +110,7 @@ func _on_credits_button_pressed() -> void:
84110
_open_sub_menu(credits_scene)
85111

86112
func _on_exit_button_pressed() -> void:
87-
get_tree().quit()
113+
exit_game()
88114

89115
func _on_credits_end_reached() -> void:
90116
if sub_menu == credits_scene:
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,47 @@
11
extends MainMenu
2+
3+
@export var level_select_packed_scene: PackedScene
4+
@export var confirm_new_game : bool = true
5+
6+
var level_select_scene : Node
7+
8+
func load_game_scene() -> void:
9+
GameStateExample.start_game()
10+
super.load_game_scene()
11+
12+
func new_game() -> void:
13+
if confirm_new_game and GameStateExample.has_game_state():
14+
%NewGameConfirmationDialog.popup_centered()
15+
else:
16+
GlobalState.reset()
17+
load_game_scene()
18+
19+
func _add_level_select_if_set() -> void:
20+
if level_select_packed_scene == null: return
21+
if GameStateExample.get_levels_reached() <= 1 : return
22+
level_select_scene = level_select_packed_scene.instantiate()
23+
level_select_scene.hide()
24+
%LevelSelectContainer.call_deferred("add_child", level_select_scene)
25+
if level_select_scene.has_signal("level_selected"):
26+
level_select_scene.connect("level_selected", load_game_scene)
27+
%LevelSelectButton.show()
28+
29+
func _show_continue_if_set() -> void:
30+
if GameStateExample.has_game_state():
31+
%ContinueGameButton.show()
32+
33+
func _ready() -> void:
34+
super._ready()
35+
_add_level_select_if_set()
36+
_show_continue_if_set()
37+
38+
func _on_continue_game_button_pressed() -> void:
39+
GameStateExample.continue_game()
40+
load_game_scene()
41+
42+
func _on_level_select_button_pressed() -> void:
43+
_open_sub_menu(level_select_scene)
44+
45+
func _on_new_game_confirmation_dialog_confirmed() -> void:
46+
GlobalState.reset()
47+
load_game_scene()

addons/maaacks_game_template/examples/scenes/menus/main_menu/main_menu.tscn

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,45 @@
77

88
[node name="MainMenu" instance=ExtResource("1_pss7b")]
99
script = ExtResource("2_lk0wa")
10+
level_select_packed_scene = null
11+
confirm_new_game = true
1012
game_scene_path = "res://addons/maaacks_game_template/examples/scenes/game_scene/game_ui.tscn"
1113
options_packed_scene = ExtResource("3_lqjmk")
1214
credits_packed_scene = ExtResource("4_cfr4i")
15+
16+
[node name="ContinueGameButton" type="Button" parent="MenuContainer/MenuButtonsMargin/MenuButtonsContainer/MenuButtonsBoxContainer" index="1"]
17+
unique_name_in_owner = true
18+
visible = false
19+
layout_mode = 2
20+
text = "Continue"
21+
22+
[node name="LevelSelectButton" type="Button" parent="MenuContainer/MenuButtonsMargin/MenuButtonsContainer/MenuButtonsBoxContainer" index="2"]
23+
unique_name_in_owner = true
24+
visible = false
25+
layout_mode = 2
26+
text = "Level Select"
27+
28+
[node name="LevelSelectContainer" type="MarginContainer" parent="." index="7"]
29+
unique_name_in_owner = true
30+
layout_mode = 1
31+
anchors_preset = 15
32+
anchor_right = 1.0
33+
anchor_bottom = 1.0
34+
mouse_filter = 2
35+
theme_override_constants/margin_left = 16
36+
theme_override_constants/margin_top = 32
37+
theme_override_constants/margin_right = 16
38+
theme_override_constants/margin_bottom = 32
39+
40+
[node name="NewGameConfirmationDialog" type="ConfirmationDialog" parent="." index="9"]
41+
unique_name_in_owner = true
42+
auto_translate_mode = 1
43+
title = "Start a New Game?"
44+
size = Vector2i(480, 158)
45+
dialog_text = "Are you sure you want to start a new game?
46+
47+
All progress in the current game will be lost."
48+
49+
[connection signal="pressed" from="MenuContainer/MenuButtonsMargin/MenuButtonsContainer/MenuButtonsBoxContainer/ContinueGameButton" to="." method="_on_continue_game_button_pressed"]
50+
[connection signal="pressed" from="MenuContainer/MenuButtonsMargin/MenuButtonsContainer/MenuButtonsBoxContainer/LevelSelectButton" to="." method="_on_level_select_button_pressed"]
51+
[connection signal="confirmed" from="NewGameConfirmationDialog" to="." method="_on_new_game_confirmation_dialog_confirmed"]

addons/maaacks_game_template/examples/scenes/menus/main_menu/main_menu_with_animations.gd

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ func intro_done() -> void:
2323
func _is_in_intro() -> bool:
2424
return animation_state_machine.get_current_node() == "Intro"
2525

26-
func _event_is_mouse_button_released(event : InputEvent) -> bool:
27-
return event is InputEventMouseButton and not event.is_pressed()
28-
2926
func _event_skips_intro(event : InputEvent) -> bool:
3027
return event.is_action_released("ui_accept") or \
3128
event.is_action_released("ui_select") or \
@@ -48,7 +45,7 @@ func _input(event : InputEvent) -> void:
4845

4946
func _add_level_select_if_set() -> void:
5047
if level_select_packed_scene == null: return
51-
if GameStateExample.get_levels_reached() <= 0 : return
48+
if GameStateExample.get_levels_reached() <= 1 : return
5249
level_select_scene = level_select_packed_scene.instantiate()
5350
level_select_scene.hide()
5451
%LevelSelectContainer.call_deferred("add_child", level_select_scene)
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,47 @@
11
extends MainMenu
2+
3+
@export var level_select_packed_scene: PackedScene
4+
@export var confirm_new_game : bool = true
5+
6+
var level_select_scene : Node
7+
8+
func load_game_scene() -> void:
9+
GameState.start_game()
10+
super.load_game_scene()
11+
12+
func new_game() -> void:
13+
if confirm_new_game and GameState.has_game_state():
14+
%NewGameConfirmationDialog.popup_centered()
15+
else:
16+
GlobalState.reset()
17+
load_game_scene()
18+
19+
func _add_level_select_if_set() -> void:
20+
if level_select_packed_scene == null: return
21+
if GameState.get_levels_reached() <= 1 : return
22+
level_select_scene = level_select_packed_scene.instantiate()
23+
level_select_scene.hide()
24+
%LevelSelectContainer.call_deferred("add_child", level_select_scene)
25+
if level_select_scene.has_signal("level_selected"):
26+
level_select_scene.connect("level_selected", load_game_scene)
27+
%LevelSelectButton.show()
28+
29+
func _show_continue_if_set() -> void:
30+
if GameState.has_game_state():
31+
%ContinueGameButton.show()
32+
33+
func _ready() -> void:
34+
super._ready()
35+
_add_level_select_if_set()
36+
_show_continue_if_set()
37+
38+
func _on_continue_game_button_pressed() -> void:
39+
GameState.continue_game()
40+
load_game_scene()
41+
42+
func _on_level_select_button_pressed() -> void:
43+
_open_sub_menu(level_select_scene)
44+
45+
func _on_new_game_confirmation_dialog_confirmed() -> void:
46+
GlobalState.reset()
47+
load_game_scene()

scenes/menus/main_menu/main_menu.tscn

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,45 @@
77

88
[node name="MainMenu" instance=ExtResource("1_peecx")]
99
script = ExtResource("2_ub2bi")
10+
level_select_packed_scene = null
11+
confirm_new_game = true
1012
game_scene_path = "res://scenes/game_scene/game_ui.tscn"
1113
options_packed_scene = ExtResource("3_x31ro")
1214
credits_packed_scene = ExtResource("4_peecx")
15+
16+
[node name="ContinueGameButton" type="Button" parent="MenuContainer/MenuButtonsMargin/MenuButtonsContainer/MenuButtonsBoxContainer" index="1"]
17+
unique_name_in_owner = true
18+
visible = false
19+
layout_mode = 2
20+
text = "Continue"
21+
22+
[node name="LevelSelectButton" type="Button" parent="MenuContainer/MenuButtonsMargin/MenuButtonsContainer/MenuButtonsBoxContainer" index="2"]
23+
unique_name_in_owner = true
24+
visible = false
25+
layout_mode = 2
26+
text = "Level Select"
27+
28+
[node name="LevelSelectContainer" type="MarginContainer" parent="." index="7"]
29+
unique_name_in_owner = true
30+
layout_mode = 1
31+
anchors_preset = 15
32+
anchor_right = 1.0
33+
anchor_bottom = 1.0
34+
mouse_filter = 2
35+
theme_override_constants/margin_left = 16
36+
theme_override_constants/margin_top = 32
37+
theme_override_constants/margin_right = 16
38+
theme_override_constants/margin_bottom = 32
39+
40+
[node name="NewGameConfirmationDialog" type="ConfirmationDialog" parent="." index="9"]
41+
unique_name_in_owner = true
42+
auto_translate_mode = 1
43+
title = "Start a New Game?"
44+
size = Vector2i(480, 158)
45+
dialog_text = "Are you sure you want to start a new game?
46+
47+
All progress in the current game will be lost."
48+
49+
[connection signal="pressed" from="MenuContainer/MenuButtonsMargin/MenuButtonsContainer/MenuButtonsBoxContainer/ContinueGameButton" to="." method="_on_continue_game_button_pressed"]
50+
[connection signal="pressed" from="MenuContainer/MenuButtonsMargin/MenuButtonsContainer/MenuButtonsBoxContainer/LevelSelectButton" to="." method="_on_level_select_button_pressed"]
51+
[connection signal="confirmed" from="NewGameConfirmationDialog" to="." method="_on_new_game_confirmation_dialog_confirmed"]

scenes/menus/main_menu/main_menu_with_animations.gd

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ func intro_done() -> void:
2323
func _is_in_intro() -> bool:
2424
return animation_state_machine.get_current_node() == "Intro"
2525

26-
func _event_is_mouse_button_released(event : InputEvent) -> bool:
27-
return event is InputEventMouseButton and not event.is_pressed()
28-
2926
func _event_skips_intro(event : InputEvent) -> bool:
3027
return event.is_action_released("ui_accept") or \
3128
event.is_action_released("ui_select") or \
@@ -48,7 +45,7 @@ func _input(event : InputEvent) -> void:
4845

4946
func _add_level_select_if_set() -> void:
5047
if level_select_packed_scene == null: return
51-
if GameState.get_levels_reached() <= 0 : return
48+
if GameState.get_levels_reached() <= 1 : return
5249
level_select_scene = level_select_packed_scene.instantiate()
5350
level_select_scene.hide()
5451
%LevelSelectContainer.call_deferred("add_child", level_select_scene)

0 commit comments

Comments
 (0)