From ca34b22c8dbeecda5ac5f66ca24fbe69a617b4dd Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Sat, 25 May 2024 10:37:59 -0400 Subject: Added text entry --- AnodyneArchipelago/Menu/InputHandler.cs | 99 +++++++++++++++++++++++++++++++ AnodyneArchipelago/Menu/MenuState.cs | 33 ++++++++++- AnodyneArchipelago/Menu/TextEntry.cs | 101 ++++++++++++++++++++++++++++++++ 3 files changed, 232 insertions(+), 1 deletion(-) create mode 100644 AnodyneArchipelago/Menu/InputHandler.cs create mode 100644 AnodyneArchipelago/Menu/TextEntry.cs (limited to 'AnodyneArchipelago') diff --git a/AnodyneArchipelago/Menu/InputHandler.cs b/AnodyneArchipelago/Menu/InputHandler.cs new file mode 100644 index 0000000..65605a2 --- /dev/null +++ b/AnodyneArchipelago/Menu/InputHandler.cs @@ -0,0 +1,99 @@ +using AnodyneSharp.Input; +using Microsoft.Xna.Framework.Input; +using System.Collections.Generic; + +namespace AnodyneArchipelago.Menu +{ + internal class InputCharacter + { + private readonly string _upper; + private readonly string _lower; + private readonly Keys _code; + + public InputCharacter(string upper, string lower, Keys code) + { + _upper = upper; + _lower = lower; + _code = code; + } + + public string ReturnCharacter(bool shiftDown) + { + return shiftDown ? _upper : _lower; + } + + public Keys ReturnKey() + { + return _code; + } + } + + internal class InputHandler + { + private static List _characters = new(); + + static InputHandler() + { + _characters.Add(new InputCharacter("A", "a", Keys.A)); + _characters.Add(new InputCharacter("B", "b", Keys.B)); + _characters.Add(new InputCharacter("C", "c", Keys.C)); + _characters.Add(new InputCharacter("D", "d", Keys.D)); + _characters.Add(new InputCharacter("E", "e", Keys.E)); + _characters.Add(new InputCharacter("F", "f", Keys.F)); + _characters.Add(new InputCharacter("G", "g", Keys.G)); + _characters.Add(new InputCharacter("H", "h", Keys.H)); + _characters.Add(new InputCharacter("I", "i", Keys.I)); + _characters.Add(new InputCharacter("J", "j", Keys.J)); + _characters.Add(new InputCharacter("K", "k", Keys.K)); + _characters.Add(new InputCharacter("L", "l", Keys.L)); + _characters.Add(new InputCharacter("M", "m", Keys.M)); + _characters.Add(new InputCharacter("N", "n", Keys.N)); + _characters.Add(new InputCharacter("O", "o", Keys.O)); + _characters.Add(new InputCharacter("P", "p", Keys.P)); + _characters.Add(new InputCharacter("Q", "q", Keys.Q)); + _characters.Add(new InputCharacter("R", "r", Keys.R)); + _characters.Add(new InputCharacter("S", "s", Keys.S)); + _characters.Add(new InputCharacter("T", "t", Keys.T)); + _characters.Add(new InputCharacter("U", "u", Keys.U)); + _characters.Add(new InputCharacter("V", "v", Keys.V)); + _characters.Add(new InputCharacter("W", "w", Keys.W)); + _characters.Add(new InputCharacter("X", "x", Keys.X)); + _characters.Add(new InputCharacter("Y", "y", Keys.Y)); + _characters.Add(new InputCharacter("Z", "z", Keys.Z)); + + _characters.Add(new InputCharacter("!", "1", Keys.D1)); + _characters.Add(new InputCharacter("@", "2", Keys.D2)); + _characters.Add(new InputCharacter("#", "3", Keys.D3)); + _characters.Add(new InputCharacter("$", "4", Keys.D4)); + _characters.Add(new InputCharacter("%", "5", Keys.D5)); + _characters.Add(new InputCharacter("^", "6", Keys.D6)); + _characters.Add(new InputCharacter("&", "7", Keys.D7)); + _characters.Add(new InputCharacter("*", "8", Keys.D8)); + _characters.Add(new InputCharacter("(", "9", Keys.D9)); + _characters.Add(new InputCharacter(")", "0", Keys.D0)); + + _characters.Add(new InputCharacter(" ", " ", Keys.Space)); + _characters.Add(new InputCharacter("<", ",", Keys.OemComma)); + _characters.Add(new InputCharacter("+", "=", Keys.OemPlus)); + _characters.Add(new InputCharacter("?", "/", Keys.OemQuestion)); + _characters.Add(new InputCharacter(">", ".", Keys.OemPeriod)); + _characters.Add(new InputCharacter("_", "-", Keys.OemMinus)); + _characters.Add(new InputCharacter("{", "[", Keys.OemOpenBrackets)); + _characters.Add(new InputCharacter("|", "\"", Keys.OemBackslash)); + _characters.Add(new InputCharacter(":", ";", Keys.OemSemicolon)); + } + + public static string ReturnCharacter() + { + foreach (InputCharacter inputCharacter in _characters) + { + if (KeyInput.JustPressedKey(inputCharacter.ReturnKey())) + { + return inputCharacter.ReturnCharacter(KeyInput.IsKeyPressed(Keys.LeftShift) || KeyInput.IsKeyPressed(Keys.RightShift)); + } + } + + return ""; + } + } +} diff --git a/AnodyneArchipelago/Menu/MenuState.cs b/AnodyneArchipelago/Menu/MenuState.cs index 08aa366..b9ee0dd 100644 --- a/AnodyneArchipelago/Menu/MenuState.cs +++ b/AnodyneArchipelago/Menu/MenuState.cs @@ -1,6 +1,7 @@ using AnodyneSharp.Input; using AnodyneSharp.Registry; using AnodyneSharp.Sounds; +using AnodyneSharp.States; using AnodyneSharp.UI; using AnodyneSharp.UI.PauseMenu; using AnodyneSharp.UI.PauseMenu.Config; @@ -24,6 +25,8 @@ namespace AnodyneArchipelago.Menu private UILabel _settingsLabel; private UILabel _quitLabel; + private State _substate = null; + private string _apServer = ""; private string _apSlot = ""; private string _apPassword = ""; @@ -62,6 +65,18 @@ namespace AnodyneArchipelago.Menu public override void Update() { + if (_substate != null) + { + _substate.Update(); + + if (_substate.Exit) + { + _substate = null; + } + + return; + } + _selector.Update(); _selector.PostUpdate(); @@ -92,6 +107,11 @@ namespace AnodyneArchipelago.Menu _connectLabel.Draw(); _settingsLabel.Draw(); _quitLabel.Draw(); + + if (_substate != null) + { + _substate.DrawUI(); + } } private void SetCursorPosition(int i) @@ -159,7 +179,7 @@ namespace AnodyneArchipelago.Menu { label.SetText(text); } - + label.Color = new Color(184, 32, 0); } } @@ -184,8 +204,19 @@ namespace AnodyneArchipelago.Menu } else if (KeyInput.JustPressedRebindableKey(KeyFunctions.Accept)) { + SoundManager.PlaySoundEffect("menu_select"); + switch (_selectorIndex) { + case 0: + _substate = new TextEntry("Server:", _apServer, (string value) => { _apServer = value; UpdateLabels(); }); + break; + case 1: + _substate = new TextEntry("Slot:", _apSlot, (string value) => { _apSlot = value; UpdateLabels(); }); + break; + case 2: + _substate = new TextEntry("Password:", _apPassword, (string value) => { _apPassword = value; UpdateLabels(); }); + break; case 6: GlobalState.ClosingGame = true; break; diff --git a/AnodyneArchipelago/Menu/TextEntry.cs b/AnodyneArchipelago/Menu/TextEntry.cs new file mode 100644 index 0000000..8be54f5 --- /dev/null +++ b/AnodyneArchipelago/Menu/TextEntry.cs @@ -0,0 +1,101 @@ +using AnodyneSharp.Input; +using AnodyneSharp.Sounds; +using AnodyneSharp.States; +using AnodyneSharp.UI; +using Microsoft.Xna.Framework; + +namespace AnodyneArchipelago.Menu +{ + internal class TextEntry : State + { + public delegate void CommitChange(string value); + + private readonly string _header; + private readonly CommitChange _commitFunc; + + private string _value; + + private UILabel _headerLabel; + private UILabel _valueLabel; + private UIEntity _bgBox; + + public TextEntry(string header, string value, CommitChange commitFunc) + { + _header = header; + _value = value; + _commitFunc = commitFunc; + + _headerLabel = new(new Vector2(20f, 44f), false, _header, new Color(226, 226, 226), AnodyneSharp.Drawing.DrawOrder.TEXT); + _valueLabel = new(new Vector2(20f, 52f), false, "", new Color(), AnodyneSharp.Drawing.DrawOrder.TEXT); + _bgBox = new UIEntity(new Vector2(16f, 40f), "pop_menu", 16, 16, AnodyneSharp.Drawing.DrawOrder.TEXTBOX); + + UpdateDisplay(); + } + + public override void Update() + { + string inputtedCharacter = InputHandler.ReturnCharacter(); + if (inputtedCharacter.Length > 0) + { + _value += inputtedCharacter; + UpdateDisplay(); + } + else if (KeyInput.JustPressedKey(Microsoft.Xna.Framework.Input.Keys.Back)) + { + if (_value.Length > 0) + { + _value = _value.Substring(0, _value.Length - 1); + UpdateDisplay(); + } + } + else if (KeyInput.JustPressedKey(Microsoft.Xna.Framework.Input.Keys.Escape) || (KeyInput.ControllerMode && KeyInput.JustPressedRebindableKey(KeyFunctions.Cancel))) + { + SoundManager.PlaySoundEffect("menu_select"); + this.Exit = true; + } + else if (KeyInput.JustPressedKey(Microsoft.Xna.Framework.Input.Keys.Enter) || (KeyInput.ControllerMode && KeyInput.JustPressedRebindableKey(KeyFunctions.Accept))) + { + SoundManager.PlaySoundEffect("menu_select"); + _commitFunc(_value); + this.Exit = true; + } + } + + public override void DrawUI() + { + _bgBox.Draw(); + _headerLabel.Draw(); + _valueLabel.Draw(); + } + + private void UpdateDisplay() + { + if (_value.Length == 0) + { + _valueLabel.SetText("[empty]"); + _valueLabel.Color = new Color(116, 140, 144); + } + else + { + string finalText = ""; + string tempText = _value; + + while (tempText.Length > 18) + { + finalText += tempText.Substring(0, 18); + finalText += "\n"; + tempText = tempText.Substring(18); + } + + finalText += tempText; + + _valueLabel.SetText(finalText); + _valueLabel.Color = new Color(184, 32, 0); + } + + float innerHeight = 8f + _valueLabel.Writer.TotalTextHeight(); + + _bgBox = new UIEntity(new Vector2(16f, 40f), "pop_menu", 136, (int)innerHeight + 8, AnodyneSharp.Drawing.DrawOrder.TEXTBOX); + } + } +} -- cgit 1.4.1