From ccd374cbedd87528c85d497fa7bef9b0c90815e9 Mon Sep 17 00:00:00 2001 From: Sophia Pearson Date: Wed, 7 Sep 2022 11:22:35 +0200 Subject: menus: implement main menu and building blocks --- Assets/Themes/Default.tres | 9 +++++++ Assets/Translations/menus.csv | 1 + Scenes/Menus/MainMenu.tscn | 27 +++++++++++++++++++++ Scenes/Menus/MainMenuButtons.tscn | 25 +++++++++++++++++++ Scenes/Terminal/ButtonBlock.tscn | 20 +++++++++++++++ Scenes/Terminal/MenuScreen.tscn | 28 +++++++++++++++++++++ Scripts/GodotExtensions/ArrayExtensions.cs | 13 ++++++++++ Scripts/GodotExtensions/NodeExtensions.cs | 14 +++++++++++ Scripts/Menus/MainMenu.cs | 26 ++++++++++++++++++++ Scripts/Menus/MainMenuButtons.cs | 39 ++++++++++++++++++++++++++++++ Scripts/Terminal/ButtonBlock.cs | 28 +++++++++++++++++++++ Scripts/Terminal/MenuScreen.cs | 27 +++++++++++++++++++++ project.godot | 2 +- 13 files changed, 258 insertions(+), 1 deletion(-) create mode 100644 Scenes/Menus/MainMenu.tscn create mode 100644 Scenes/Menus/MainMenuButtons.tscn create mode 100644 Scenes/Terminal/ButtonBlock.tscn create mode 100644 Scenes/Terminal/MenuScreen.tscn create mode 100644 Scripts/GodotExtensions/ArrayExtensions.cs create mode 100644 Scripts/GodotExtensions/NodeExtensions.cs create mode 100644 Scripts/Menus/MainMenu.cs create mode 100644 Scripts/Menus/MainMenuButtons.cs create mode 100644 Scripts/Terminal/ButtonBlock.cs create mode 100644 Scripts/Terminal/MenuScreen.cs 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(this Array array, Action 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 GetChildren(this Node node) + { + return new Array(node.GetChildren().OfType()); + } + } +} \ 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($"%{nameof(Buttons)}"); + + public override void _Ready() + { + ConnectButtons(); + Buttons.GetChildren