Added main menu

This commit is contained in:
2026-06-27 17:31:24 +03:00
parent 67db40fa46
commit f9c4bd373a
28 changed files with 926 additions and 0 deletions
+45
View File
@@ -0,0 +1,45 @@
class_name MainMenu
extends Control
@onready var start_button : Button = $%StartButton
@onready var options_button : Button = $%OptionsButton
@onready var quit_button : Button = $%QuitButton
func _ready() -> void:
if OS.get_name() == "Web":
_setup_for_web()
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
#TODO Add menu music
start_button.grab_focus()
get_viewport().gui_focus_changed.connect(_on_gui_focus_changed)
func _setup_for_web() -> void:
quit_button.hide()
start_button.focus_neighbor_top = options_button.get_path()
options_button.focus_neighbor_bottom = start_button.get_path()
func _on_gui_focus_changed(_node: Control) -> void:
SoundManager.play_ui_stream(SoundManager.ui_stream_select)
func _on_start_button_pressed() -> void:
SoundManager.play_ui_stream(SoundManager.ui_stream_accept)
#TODO transition to level selection
func _on_options_button_pressed() -> void:
SoundManager.play_ui_stream(SoundManager.ui_stream_accept)
get_tree().change_scene_to_file("res://game/menu/options_menu.tscn")
func _on_quit_button_pressed() -> void:
var stream_player := SoundManager.play_ui_stream(SoundManager.ui_stream_decline)
await stream_player.finished
get_tree().quit()
+1
View File
@@ -0,0 +1 @@
uid://daw3vlybwcj5l
+60
View File
@@ -0,0 +1,60 @@
[gd_scene format=3 uid="uid://cl0h2acqcq5wq"]
[ext_resource type="Theme" uid="uid://bqj884yfvhhft" path="res://game/themes/main_menu.tres" id="1_5d27k"]
[ext_resource type="Script" uid="uid://daw3vlybwcj5l" path="res://game/menu/main_menu.gd" id="2_qnvmd"]
[ext_resource type="FontFile" uid="uid://bslwwl3rn7mt2" path="res://fonts/Px437_HP_100LX_8x8.ttf" id="3_i4f54"]
[node name="MainMenu" type="Control" unique_id=569032006]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme = ExtResource("1_5d27k")
script = ExtResource("2_qnvmd")
[node name="MarginContainer" type="MarginContainer" parent="." unique_id=1180781679]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer" unique_id=736037128]
layout_mode = 2
size_flags_horizontal = 4
alignment = 1
[node name="StartButton" type="Button" parent="MarginContainer/VBoxContainer" unique_id=1504018605]
unique_name_in_owner = true
layout_mode = 2
focus_neighbor_top = NodePath("../QuitButton")
text = "START"
[node name="OptionsButton" type="Button" parent="MarginContainer/VBoxContainer" unique_id=1073262524]
unique_name_in_owner = true
layout_mode = 2
text = "OPTIONS"
[node name="QuitButton" type="Button" parent="MarginContainer/VBoxContainer" unique_id=1029660410]
unique_name_in_owner = true
layout_mode = 2
focus_neighbor_bottom = NodePath("../StartButton")
text = "QUIT"
[node name="CopyrightLabel" type="Label" parent="MarginContainer" unique_id=2068603030]
layout_mode = 2
size_flags_vertical = 1
theme_override_fonts/font = ExtResource("3_i4f54")
theme_override_font_sizes/font_size = 8
text = "v 1.0.0
(c) Ruslan Ignatov 2026
Powered by Godot Engine"
horizontal_alignment = 2
vertical_alignment = 2
[connection signal="pressed" from="MarginContainer/VBoxContainer/StartButton" to="." method="_on_start_button_pressed"]
[connection signal="pressed" from="MarginContainer/VBoxContainer/OptionsButton" to="." method="_on_options_button_pressed"]
[connection signal="pressed" from="MarginContainer/VBoxContainer/QuitButton" to="." method="_on_quit_button_pressed"]
+112
View File
@@ -0,0 +1,112 @@
class_name OptionsMenu
extends Control
const WINDOW_FACTOR = "window_factor"
var _play_sound := false
@onready var fullscreen_button : CheckButton = $%FullscreenCheckButton
@onready var window_factor_buttons : HBoxContainer = $%WindowFactorContainer
@onready var back_button : Button = $%BackButton
@onready var master_slider : Slider = $%MasterSlider
@onready var ui_slider : Slider = $%UISlider
@onready var sfx_slider : Slider = $%SFXSlider
@onready var music_slider : Slider = $%MusicSlider
func _ready() -> void:
_load_current_settings()
_connect_window_factor_buttons()
fullscreen_button.grab_focus()
if OS.get_name() == "Web":
_setup_for_web()
master_slider.grab_focus()
_play_sound = true
get_viewport().gui_focus_changed.connect(_on_gui_focus_changed)
func _setup_for_web() -> void:
$%FullscreenLabel.hide()
$%WindowFactorLabel.hide()
fullscreen_button.hide()
window_factor_buttons.hide()
master_slider.focus_neighbor_top = back_button.get_path()
back_button.focus_neighbor_bottom = master_slider.get_path()
func _connect_window_factor_buttons() -> void:
for child in window_factor_buttons.get_children():
if child is Button:
var button : Button = child
button.pressed.connect(_on_window_factor_button_pressed.bind(button))
func _load_current_settings() -> void:
fullscreen_button.button_pressed = SettingsManager.fullscreen
for child in window_factor_buttons.get_children():
if child is Button:
var button : Button = child
var window_factor : int = button.get_meta(WINDOW_FACTOR, 0)
if window_factor == SettingsManager.window_factor:
button.button_pressed = true
_update_window_factor_disabled()
master_slider.value = SettingsManager.master_volume
ui_slider.value = SettingsManager.ui_volume
sfx_slider.value = SettingsManager.sfx_volume
music_slider.value = SettingsManager.music_volume
func _update_window_factor_disabled() -> void:
for child in window_factor_buttons.get_children():
if not child is Button: continue
child.disabled = SettingsManager.fullscreen
child.focus_mode = Control.FOCUS_NONE if SettingsManager.fullscreen else Control.FOCUS_ALL
func _on_gui_focus_changed(_node: Control) -> void:
SoundManager.play_ui_stream(SoundManager.ui_stream_select)
func _on_fullscreen_check_button_toggled(toggled: bool) -> void:
if _play_sound: SoundManager.play_ui_stream(SoundManager.ui_stream_accept)
SettingsManager.fullscreen = toggled
_update_window_factor_disabled()
func _on_back_button_pressed() -> void:
if _play_sound: SoundManager.play_ui_stream(SoundManager.ui_stream_decline)
get_tree().change_scene_to_file("res://game/menu/main_menu.tscn")
func _on_window_factor_button_pressed(button: Button) -> void:
if _play_sound: SoundManager.play_ui_stream(SoundManager.ui_stream_accept)
var window_factor : int = button.get_meta(WINDOW_FACTOR, 0)
if window_factor > 0:
SettingsManager.window_factor = window_factor
func _on_master_volume_changed(value: float) -> void:
if _play_sound: SoundManager.play_ui_stream(SoundManager.ui_stream_select)
SettingsManager.master_volume = floor(value)
func _on_ui_volume_changed(value: float) -> void:
if _play_sound: SoundManager.play_ui_stream(SoundManager.ui_stream_select)
SettingsManager.ui_volume = floor(value)
func _on_sfx_volume_changed(value: float) -> void:
var screen_center := SettingsManager.window_base_size/2.0
if _play_sound: SoundManager.play_sfx_stream(SoundManager.ui_stream_select, screen_center)
SettingsManager.sfx_volume = floor(value)
func _on_music_volume_changed(value: float) -> void:
SettingsManager.music_volume = floor(value)
+1
View File
@@ -0,0 +1 @@
uid://c6qaxjgpf8ydx
+149
View File
@@ -0,0 +1,149 @@
[gd_scene format=3 uid="uid://dnxfvop505syi"]
[ext_resource type="Theme" uid="uid://bqj884yfvhhft" path="res://game/themes/main_menu.tres" id="1_e2bp2"]
[ext_resource type="Script" uid="uid://c6qaxjgpf8ydx" path="res://game/menu/options_menu.gd" id="1_lq2ks"]
[sub_resource type="InputEventAction" id="InputEventAction_j72d6"]
action = &"ui_cancel"
[sub_resource type="Shortcut" id="Shortcut_e2bp2"]
events = [SubResource("InputEventAction_j72d6")]
[node name="OptionsMenu" type="Control" unique_id=1463826396]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme = ExtResource("1_e2bp2")
script = ExtResource("1_lq2ks")
[node name="MarginContainer" type="MarginContainer" parent="." unique_id=2127037660]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer" unique_id=1647231354]
layout_mode = 2
alignment = 1
[node name="GridContainer" type="GridContainer" parent="MarginContainer/VBoxContainer" unique_id=1356622174]
layout_mode = 2
size_flags_horizontal = 4
columns = 2
[node name="FullscreenLabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer" unique_id=1820060227]
unique_name_in_owner = true
layout_mode = 2
[node name="FullscreenCheckButton" type="CheckButton" parent="MarginContainer/VBoxContainer/GridContainer" unique_id=129623184]
unique_name_in_owner = true
layout_mode = 2
text = "FULLSCREEN"
[node name="WindowFactorLabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer" unique_id=1054219556]
unique_name_in_owner = true
layout_mode = 2
[node name="WindowFactorContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer/GridContainer" unique_id=2006592987]
unique_name_in_owner = true
layout_mode = 2
[node name="ButtonX1" type="Button" parent="MarginContainer/VBoxContainer/GridContainer/WindowFactorContainer" unique_id=978982542]
layout_mode = 2
toggle_mode = true
text = "X1"
metadata/window_factor = 1
[node name="ButtonX2" type="Button" parent="MarginContainer/VBoxContainer/GridContainer/WindowFactorContainer" unique_id=422646167]
layout_mode = 2
toggle_mode = true
text = "X2"
metadata/window_factor = 2
[node name="ButtonX3" type="Button" parent="MarginContainer/VBoxContainer/GridContainer/WindowFactorContainer" unique_id=317316950]
layout_mode = 2
toggle_mode = true
text = "X3"
metadata/window_factor = 3
[node name="ButtonX4" type="Button" parent="MarginContainer/VBoxContainer/GridContainer/WindowFactorContainer" unique_id=1096197974]
layout_mode = 2
toggle_mode = true
text = "X4"
metadata/window_factor = 4
[node name="ButtonX5" type="Button" parent="MarginContainer/VBoxContainer/GridContainer/WindowFactorContainer" unique_id=1598256151]
layout_mode = 2
toggle_mode = true
text = "X5"
metadata/window_factor = 5
[node name="MasterLabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer" unique_id=1502062154]
layout_mode = 2
text = "MASTER"
[node name="MasterSlider" type="HSlider" parent="MarginContainer/VBoxContainer/GridContainer" unique_id=1600615574]
unique_name_in_owner = true
layout_mode = 2
step = 10.0
tick_count = 11
ticks_on_borders = true
ticks_position = 2
[node name="UILabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer" unique_id=1039303416]
layout_mode = 2
text = "UI"
[node name="UISlider" type="HSlider" parent="MarginContainer/VBoxContainer/GridContainer" unique_id=2094741924]
unique_name_in_owner = true
layout_mode = 2
step = 10.0
tick_count = 11
ticks_on_borders = true
ticks_position = 2
[node name="SFXLabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer" unique_id=122025284]
layout_mode = 2
text = "SFX"
[node name="SFXSlider" type="HSlider" parent="MarginContainer/VBoxContainer/GridContainer" unique_id=630139889]
unique_name_in_owner = true
layout_mode = 2
step = 10.0
tick_count = 11
ticks_on_borders = true
ticks_position = 2
[node name="MusicLabel" type="Label" parent="MarginContainer/VBoxContainer/GridContainer" unique_id=2133353313]
layout_mode = 2
text = "MUSIC"
[node name="MusicSlider" type="HSlider" parent="MarginContainer/VBoxContainer/GridContainer" unique_id=537100873]
unique_name_in_owner = true
layout_mode = 2
step = 10.0
tick_count = 11
ticks_on_borders = true
ticks_position = 2
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer" unique_id=676353768]
layout_mode = 2
alignment = 1
[node name="BackButton" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer" unique_id=131108983]
unique_name_in_owner = true
layout_mode = 2
shortcut = SubResource("Shortcut_e2bp2")
text = "BACK"
[connection signal="toggled" from="MarginContainer/VBoxContainer/GridContainer/FullscreenCheckButton" to="." method="_on_fullscreen_check_button_toggled"]
[connection signal="value_changed" from="MarginContainer/VBoxContainer/GridContainer/MasterSlider" to="." method="_on_master_volume_changed"]
[connection signal="value_changed" from="MarginContainer/VBoxContainer/GridContainer/UISlider" to="." method="_on_ui_volume_changed"]
[connection signal="value_changed" from="MarginContainer/VBoxContainer/GridContainer/SFXSlider" to="." method="_on_sfx_volume_changed"]
[connection signal="value_changed" from="MarginContainer/VBoxContainer/GridContainer/MusicSlider" to="." method="_on_music_volume_changed"]
[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/BackButton" to="." method="_on_back_button_pressed"]