summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSophia Pearson <codergal89@gmail.com>2022-09-07 11:22:35 +0200
committerSophia Pearson <codergal89@gmail.com>2022-09-07 11:22:35 +0200
commitccd374cbedd87528c85d497fa7bef9b0c90815e9 (patch)
treed146de06e0d91a30d37b6d8ccb4d6e5b7dceda03
parent23a3b14f4d3662f20d7202aeb569b789b520ba57 (diff)
downloadtexty-ccd374cbedd87528c85d497fa7bef9b0c90815e9.tar.xz
texty-ccd374cbedd87528c85d497fa7bef9b0c90815e9.zip
menus: implement main menu and building blocks
-rw-r--r--Assets/Themes/Default.tres9
-rw-r--r--Assets/Translations/menus.csv1
-rw-r--r--Scenes/Menus/MainMenu.tscn27
-rw-r--r--Scenes/Menus/MainMenuButtons.tscn25
-rw-r--r--Scenes/Terminal/ButtonBlock.tscn20
-rw-r--r--Scenes/Terminal/MenuScreen.tscn28
-rw-r--r--Scripts/GodotExtensions/ArrayExtensions.cs13
-rw-r--r--Scripts/GodotExtensions/NodeExtensions.cs14
-rw-r--r--Scripts/Menus/MainMenu.cs26
-rw-r--r--Scripts/Menus/MainMenuButtons.cs39
-rw-r--r--Scripts/Terminal/ButtonBlock.cs28
-rw-r--r--Scripts/Terminal/MenuScreen.cs27
-rw-r--r--project.godot2
13 files changed, 258 insertions, 1 deletions
diff --git a/Assets/Themes/Default.tres b/Assets/Themes/Default.tres
index 6b7a217..9a8a2ec 100644
--- a/Assets/Themes/Default.tres
+++ b/Assets/Themes/Default.tres
@@ -16,6 +16,15 @@
[sub_resource type="StyleBoxEmpty" id=6]
[resource]
+Button/colors/font_color = Color( 0.243137, 0.811765, 0.235294, 1 )
+Button/colors/font_color_focus = Color( 0.2, 0.2, 0.2, 1 )
+Button/colors/font_color_hover = Color( 0.2, 0.2, 0.2, 1 )
+Button/colors/font_color_pressed = Color( 0.2, 0.2, 0.2, 1 )
+Button/constants/hseparation = 0
+Button/styles/disabled = ExtResource( 2 )
+Button/styles/focus = ExtResource( 1 )
+Button/styles/hover = ExtResource( 1 )
+Button/styles/normal = ExtResource( 2 )
InvertedLabel/base_type = "Label"
InvertedLabel/colors/font_color = Color( 0.2, 0.2, 0.2, 1 )
InvertedPanelContainer/base_type = "PanelContainer"
diff --git a/Assets/Translations/menus.csv b/Assets/Translations/menus.csv
index 6503b66..77e5e3e 100644
--- a/Assets/Translations/menus.csv
+++ b/Assets/Translations/menus.csv
@@ -2,3 +2,4 @@ keys,en,de
BUTTON_CREDITS,"Credits","Danksagung"
BUTTON_QUIT_GAME,"Quit","Beenden"
BUTTON_START_GAME,"Start Adventure","Abenteuer starten"
+TITLE_MAIN_MENU,"Main Menu","Hauptmenü"
diff --git a/Scenes/Menus/MainMenu.tscn b/Scenes/Menus/MainMenu.tscn
new file mode 100644
index 0000000..f8e4661
--- /dev/null
+++ b/Scenes/Menus/MainMenu.tscn
@@ -0,0 +1,27 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://Scenes/Terminal/MenuScreen.tscn" type="PackedScene" id=1]
+[ext_resource path="res://Scenes/Menus/MainMenuButtons.tscn" type="PackedScene" id=2]
+[ext_resource path="res://Scripts/Menus/MainMenu.cs" type="Script" id=3]
+
+[node name="MainMenu" type="Node"]
+script = ExtResource( 3 )
+
+[node name="MenuScreen" parent="." instance=ExtResource( 1 )]
+Title = "TITLE_MAIN_MENU"
+
+[node name="TitleArea" parent="MenuScreen/ScreenContainer/TopBar" index="0"]
+Title = "[center]TITLE_MAIN_MENU[/center]"
+
+[node name="Buttons" parent="MenuScreen/ScreenContainer/Content" index="0" instance=ExtResource( 2 )]
+anchor_right = 0.0
+anchor_bottom = 0.0
+margin_left = 8.0
+margin_right = 792.0
+margin_bottom = 573.0
+
+[connection signal="CreditsButtonPressed" from="MenuScreen/ScreenContainer/Content/Buttons" to="." method="OnCreditsButtonPressed"]
+[connection signal="QuitButtonPressed" from="MenuScreen/ScreenContainer/Content/Buttons" to="." method="OnQuitButtonPressed"]
+[connection signal="StartButtonPressed" from="MenuScreen/ScreenContainer/Content/Buttons" to="." method="OnStartButtonPressed"]
+
+[editable path="MenuScreen"]
diff --git a/Scenes/Menus/MainMenuButtons.tscn b/Scenes/Menus/MainMenuButtons.tscn
new file mode 100644
index 0000000..301c121
--- /dev/null
+++ b/Scenes/Menus/MainMenuButtons.tscn
@@ -0,0 +1,25 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://Scenes/Terminal/ButtonBlock.tscn" type="PackedScene" id=1]
+[ext_resource path="res://Scripts/Menus/MainMenuButtons.cs" type="Script" id=2]
+
+[node name="MainMenuButtons" instance=ExtResource( 1 )]
+script = ExtResource( 2 )
+
+[node name="StartButton" type="Button" parent="Buttons" index="0"]
+margin_top = 262.0
+margin_right = 400.0
+margin_bottom = 287.0
+text = "BUTTON_START_GAME"
+
+[node name="CreditsButton" type="Button" parent="Buttons" index="1"]
+margin_top = 287.0
+margin_right = 400.0
+margin_bottom = 312.0
+text = "BUTTON_CREDITS"
+
+[node name="QuitButton" type="Button" parent="Buttons" index="2"]
+margin_top = 312.0
+margin_right = 400.0
+margin_bottom = 337.0
+text = "BUTTON_QUIT_GAME"
diff --git a/Scenes/Terminal/ButtonBlock.tscn b/Scenes/Terminal/ButtonBlock.tscn
new file mode 100644
index 0000000..d8d535a
--- /dev/null
+++ b/Scenes/Terminal/ButtonBlock.tscn
@@ -0,0 +1,20 @@
+[gd_scene load_steps=2 format=2]
+
+[ext_resource path="res://Scripts/Terminal/ButtonBlock.cs" type="Script" id=1]
+
+[node name="ButtonBlock" type="MarginContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+custom_constants/margin_right = 200
+custom_constants/margin_left = 200
+script = ExtResource( 1 )
+
+[node name="Buttons" type="VBoxContainer" parent="."]
+unique_name_in_owner = true
+margin_left = 200.0
+margin_right = 600.0
+margin_bottom = 600.0
+custom_constants/separation = 0
+alignment = 1
diff --git a/Scenes/Terminal/MenuScreen.tscn b/Scenes/Terminal/MenuScreen.tscn
new file mode 100644
index 0000000..84e8a63
--- /dev/null
+++ b/Scenes/Terminal/MenuScreen.tscn
@@ -0,0 +1,28 @@
+[gd_scene load_steps=4 format=2]
+
+[ext_resource path="res://Scenes/Terminal/Screen.tscn" type="PackedScene" id=1]
+[ext_resource path="res://Scenes/Terminal/StatusArea.tscn" type="PackedScene" id=2]
+[ext_resource path="res://Scripts/Terminal/MenuScreen.cs" type="Script" id=3]
+
+[node name="MenuScreen" instance=ExtResource( 1 )]
+script = ExtResource( 3 )
+
+[node name="TopBar" parent="ScreenContainer" index="0"]
+margin_right = 800.0
+margin_bottom = 27.0
+
+[node name="TitleArea" parent="ScreenContainer/TopBar" index="0" instance=ExtResource( 2 )]
+unique_name_in_owner = true
+margin_left = 8.0
+margin_right = 792.0
+Title = "[center][/center]"
+
+[node name="Content" parent="ScreenContainer" index="1"]
+margin_top = 27.0
+margin_right = 800.0
+margin_bottom = 600.0
+
+[node name="BottomBar" parent="ScreenContainer" index="2"]
+margin_top = 600.0
+margin_right = 800.0
+margin_bottom = 600.0
diff --git a/Scripts/GodotExtensions/ArrayExtensions.cs b/Scripts/GodotExtensions/ArrayExtensions.cs
new file mode 100644
index 0000000..aa3a9c4
--- /dev/null
+++ b/Scripts/GodotExtensions/ArrayExtensions.cs
@@ -0,0 +1,13 @@
+using System;
+using Godot.Collections;
+
+namespace Texty.Scripts.GodotExtensions
+{
+ public static class ArrayExtensions
+ {
+ public static void ForEach<T>(this Array<T> array, Action<T> action)
+ {
+ foreach (var element in array) action.Invoke(element);
+ }
+ }
+} \ No newline at end of file
diff --git a/Scripts/GodotExtensions/NodeExtensions.cs b/Scripts/GodotExtensions/NodeExtensions.cs
new file mode 100644
index 0000000..b398985
--- /dev/null
+++ b/Scripts/GodotExtensions/NodeExtensions.cs
@@ -0,0 +1,14 @@
+using System.Linq;
+using Godot;
+using Godot.Collections;
+
+namespace Texty.Scripts.GodotExtensions
+{
+ public static class NodeExtensions
+ {
+ public static Array<T> GetChildren<T>(this Node node)
+ {
+ return new Array<T>(node.GetChildren().OfType<T>());
+ }
+ }
+} \ No newline at end of file
diff --git a/Scripts/Menus/MainMenu.cs b/Scripts/Menus/MainMenu.cs
new file mode 100644
index 0000000..3beaead
--- /dev/null
+++ b/Scripts/Menus/MainMenu.cs
@@ -0,0 +1,26 @@
+using Godot;
+
+namespace Texty.Scripts.Menus
+{
+ public class MainMenu : Node
+ {
+ public override void _Ready()
+ {
+ }
+
+ public void OnStartButtonPressed()
+ {
+ GD.Print("Start button was pressed.");
+ }
+
+ public void OnCreditsButtonPressed()
+ {
+ GD.Print("Credits button was pressed.");
+ }
+
+ public void OnQuitButtonPressed()
+ {
+ GetTree().Quit();
+ }
+ }
+} \ No newline at end of file
diff --git a/Scripts/Menus/MainMenuButtons.cs b/Scripts/Menus/MainMenuButtons.cs
new file mode 100644
index 0000000..c2af034
--- /dev/null
+++ b/Scripts/Menus/MainMenuButtons.cs
@@ -0,0 +1,39 @@
+using System;
+using Godot;
+using Texty.Scripts.Terminal;
+
+namespace Texty.Scripts.Menus
+{
+ public class MainMenuButtons : ButtonBlock
+ {
+ [Signal] public delegate void CreditsButtonPressed();
+ [Signal] public delegate void QuitButtonPressed();
+ [Signal] public delegate void StartButtonPressed();
+
+ protected override void OnButtonPressed(int index)
+ {
+ if (!Enum.IsDefined(typeof(Buttons), 1)) return;
+ switch ((Buttons)index)
+ {
+ case Buttons.Start:
+ EmitSignal(nameof(StartButtonPressed));
+ break;
+ case Buttons.Credits:
+ EmitSignal(nameof(CreditsButtonPressed));
+ break;
+ case Buttons.Quit:
+ EmitSignal(nameof(QuitButtonPressed));
+ break;
+ default:
+ throw new ArgumentOutOfRangeException(nameof(index), index, "Button not implemented!");
+ }
+ }
+
+ private enum Buttons
+ {
+ Start = 0,
+ Credits = 1,
+ Quit = 2
+ }
+ }
+} \ No newline at end of file
diff --git a/Scripts/Terminal/ButtonBlock.cs b/Scripts/Terminal/ButtonBlock.cs
new file mode 100644
index 0000000..769fdf8
--- /dev/null
+++ b/Scripts/Terminal/ButtonBlock.cs
@@ -0,0 +1,28 @@
+using System.Linq;
+using Godot;
+using Godot.Collections;
+using Texty.Scripts.GodotExtensions;
+
+namespace Texty.Scripts.Terminal
+{
+ [Tool]
+ public abstract class ButtonBlock : MarginContainer
+ {
+ private VBoxContainer Buttons => GetNodeOrNull<VBoxContainer>($"%{nameof(Buttons)}");
+
+ public override void _Ready()
+ {
+ ConnectButtons();
+ Buttons.GetChildren<Button>().ForEach(button => button.MouseFilter = MouseFilterEnum.Ignore);
+ Buttons.GetChildren<Button>().FirstOrDefault()?.GrabFocus();
+ }
+
+ protected abstract void OnButtonPressed(int index);
+
+ private void ConnectButtons()
+ {
+ foreach (var (button, index) in Buttons.GetChildren<Button>().Select((button, index) => (button, index)))
+ button.Connect("pressed", this, nameof(OnButtonPressed), new Array(index));
+ }
+ }
+} \ No newline at end of file
diff --git a/Scripts/Terminal/MenuScreen.cs b/Scripts/Terminal/MenuScreen.cs
new file mode 100644
index 0000000..5c3abfb
--- /dev/null
+++ b/Scripts/Terminal/MenuScreen.cs
@@ -0,0 +1,27 @@
+using Godot;
+
+namespace Texty.Scripts.Terminal
+{
+ [Tool]
+ public class MenuScreen : Control
+ {
+ private string _title = "";
+ private StatusArea TitleArea => GetNodeOrNull<StatusArea>($"%{nameof(TitleArea)}");
+
+ [Export]
+ public string Title
+ {
+ get => _title;
+ set
+ {
+ _title = value;
+ if (TitleArea != null) TitleArea.Title = $"[center]{GodotSharp.Singleton.Tr(_title)}[/center]";
+ }
+ }
+
+ public override void _Ready()
+ {
+ Title = _title;
+ }
+ }
+} \ No newline at end of file
diff --git a/project.godot b/project.godot
index aa09f0d..9983d36 100644
--- a/project.godot
+++ b/project.godot
@@ -39,7 +39,7 @@ _global_script_class_icons={
[application]
config/name="Texty"
-run/main_scene="res://Scenes/Game/Game.tscn"
+run/main_scene="res://Scenes/Menus/MainMenu.tscn"
run/delta_sync_after_draw=true
config/icon="res://icon.png"