diff options
| author | Sophia Pearson <codergal89@gmail.com> | 2022-09-07 11:22:35 +0200 |
|---|---|---|
| committer | Sophia Pearson <codergal89@gmail.com> | 2022-09-07 11:22:35 +0200 |
| commit | ccd374cbedd87528c85d497fa7bef9b0c90815e9 (patch) | |
| tree | d146de06e0d91a30d37b6d8ccb4d6e5b7dceda03 | |
| parent | 23a3b14f4d3662f20d7202aeb569b789b520ba57 (diff) | |
| download | texty-ccd374cbedd87528c85d497fa7bef9b0c90815e9.tar.xz texty-ccd374cbedd87528c85d497fa7bef9b0c90815e9.zip | |
menus: implement main menu and building blocks
| -rw-r--r-- | Assets/Themes/Default.tres | 9 | ||||
| -rw-r--r-- | Assets/Translations/menus.csv | 1 | ||||
| -rw-r--r-- | Scenes/Menus/MainMenu.tscn | 27 | ||||
| -rw-r--r-- | Scenes/Menus/MainMenuButtons.tscn | 25 | ||||
| -rw-r--r-- | Scenes/Terminal/ButtonBlock.tscn | 20 | ||||
| -rw-r--r-- | Scenes/Terminal/MenuScreen.tscn | 28 | ||||
| -rw-r--r-- | Scripts/GodotExtensions/ArrayExtensions.cs | 13 | ||||
| -rw-r--r-- | Scripts/GodotExtensions/NodeExtensions.cs | 14 | ||||
| -rw-r--r-- | Scripts/Menus/MainMenu.cs | 26 | ||||
| -rw-r--r-- | Scripts/Menus/MainMenuButtons.cs | 39 | ||||
| -rw-r--r-- | Scripts/Terminal/ButtonBlock.cs | 28 | ||||
| -rw-r--r-- | Scripts/Terminal/MenuScreen.cs | 27 | ||||
| -rw-r--r-- | project.godot | 2 |
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" |
