From 0e33a33270e9af930a17d086ebf8577e0c71f6d3 Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Wed, 5 Jul 2023 01:16:17 +0530 Subject: [PATCH] keyboard/gameepad input for menu --- src/gui/AboutMenuOptionsGui.hx | 2 ++ src/gui/AchievementsGui.hx | 3 +++ src/gui/DifficultySelectGui.hx | 1 + src/gui/EndGameGui.hx | 3 +++ src/gui/GuiXboxButton.hx | 13 +++++++++---- src/gui/GuiXboxList.hx | 28 ++++++++++++++++++++++++++++ src/gui/GuiXboxListButton.hx | 19 ++++++++++++++++++- src/gui/HelpCreditsGui.hx | 3 ++- src/gui/InputOptionsGui.hx | 3 ++- src/gui/KeyBindingsGui.hx | 1 + src/gui/LevelSelectGui.hx | 4 ++++ src/gui/MarblePickerGui.hx | 3 ++- src/gui/MessageBoxOkDlg.hx | 2 +- src/gui/MessageBoxYesNoDlg.hx | 4 ++-- src/gui/MiscOptionsGui.hx | 3 ++- src/gui/OptionsListGui.hx | 1 + src/gui/ReplayCenterGui.hx | 3 +++ src/gui/ReplayNameDlg.hx | 4 ++-- src/gui/TouchCtrlsEditGui.hx | 2 ++ src/gui/VersionGui.hx | 3 ++- src/gui/VideoOptionsGui.hx | 3 ++- 21 files changed, 92 insertions(+), 16 deletions(-) diff --git a/src/gui/AboutMenuOptionsGui.hx b/src/gui/AboutMenuOptionsGui.hx index c25d1f5b..0fc5eb4f 100644 --- a/src/gui/AboutMenuOptionsGui.hx +++ b/src/gui/AboutMenuOptionsGui.hx @@ -1,5 +1,6 @@ package gui; +import hxd.Key; import src.MarbleGame; import hxd.res.BitmapFont; import h3d.Vector; @@ -108,6 +109,7 @@ class AboutMenuOptionsGui extends GuiImage { backButton.vertSizing = Bottom; backButton.horizSizing = Right; backButton.gamepadAccelerator = ["B"]; + backButton.accelerators = [Key.ESCAPE, Key.BACKSPACE]; if (pauseGui) backButton.pressedAction = (e) -> { MarbleGame.canvas.popDialog(this); diff --git a/src/gui/AchievementsGui.hx b/src/gui/AchievementsGui.hx index 31ecefb5..352136fd 100644 --- a/src/gui/AchievementsGui.hx +++ b/src/gui/AchievementsGui.hx @@ -116,6 +116,7 @@ class AchievementsGui extends GuiImage { backButton.vertSizing = Bottom; backButton.horizSizing = Right; backButton.gamepadAccelerator = ["B"]; + backButton.accelerators = [hxd.Key.ESCAPE, hxd.Key.BACKSPACE]; if (isPause) backButton.pressedAction = (e) -> { MarbleGame.canvas.popDialog(this); @@ -129,6 +130,8 @@ class AchievementsGui extends GuiImage { nextButton.position = new Vector(960, 0); nextButton.vertSizing = Bottom; nextButton.horizSizing = Right; + nextButton.accelerators = [hxd.Key.ENTER]; + nextButton.gamepadAccelerator = ["X"]; nextButton.pressedAction = (e) -> { var desc = "Select an achievement from the list."; var selection = curSelection; diff --git a/src/gui/DifficultySelectGui.hx b/src/gui/DifficultySelectGui.hx index db75291b..011e277f 100644 --- a/src/gui/DifficultySelectGui.hx +++ b/src/gui/DifficultySelectGui.hx @@ -84,6 +84,7 @@ class DifficultySelectGui extends GuiImage { backButton.vertSizing = Bottom; backButton.horizSizing = Right; backButton.gamepadAccelerator = ["B"]; + backButton.accelerators = [hxd.Key.ESCAPE, hxd.Key.BACKSPACE]; backButton.pressedAction = (e) -> MarbleGame.canvas.setContent(new MainMenuGui()); bottomBar.addChild(backButton); } diff --git a/src/gui/EndGameGui.hx b/src/gui/EndGameGui.hx index 1207e621..5915437f 100644 --- a/src/gui/EndGameGui.hx +++ b/src/gui/EndGameGui.hx @@ -153,6 +153,7 @@ class EndGameGui extends GuiImage { retryButton.vertSizing = Bottom; retryButton.horizSizing = Right; retryButton.gamepadAccelerator = ["B"]; + retryButton.accelerators = [hxd.Key.ESCAPE, hxd.Key.BACKSPACE]; retryButton.pressedAction = (e) -> restartFunc(retryButton); bottomBar.addChild(retryButton); @@ -166,6 +167,8 @@ class EndGameGui extends GuiImage { nextButton.position = new Vector(960, 0); nextButton.vertSizing = Bottom; nextButton.horizSizing = Right; + nextButton.gamepadAccelerator = ["A"]; + nextButton.accelerators = [hxd.Key.ENTER]; nextButton.pressedAction = (e) -> continueFunc(nextButton); bottomBar.addChild(nextButton); } diff --git a/src/gui/GuiXboxButton.hx b/src/gui/GuiXboxButton.hx index c99ef5b8..c5b20495 100644 --- a/src/gui/GuiXboxButton.hx +++ b/src/gui/GuiXboxButton.hx @@ -24,7 +24,7 @@ class GuiXboxButton extends GuiControl { public var buttonSounds:Bool = true; - public var accelerator:Int = 0; + public var accelerators:Array = []; public var gamepadAccelerator:Array = []; public var acceleratorWasPressed = false; @@ -116,16 +116,21 @@ class GuiXboxButton extends GuiControl { pressed = false; } if (!disabled) { - if (acceleratorWasPressed && (accelerator != 0 && hxd.Key.isReleased(accelerator)) || Gamepad.isReleased(gamepadAccelerator)) { + if (acceleratorWasPressed + && (accelerators.length != 0 && accelerators.map(x -> hxd.Key.isReleased(x)).contains(true)) + || Gamepad.isReleased(gamepadAccelerator)) { if (this.pressedAction != null) { this.pressedAction(new GuiEvent(this)); } - } else if ((accelerator != 0 && hxd.Key.isPressed(accelerator)) || Gamepad.isPressed(gamepadAccelerator)) { + } else if (accelerators.length != 0 + && accelerators.map(x -> hxd.Key.isPressed(x)).contains(true) + || Gamepad.isPressed(gamepadAccelerator)) { acceleratorWasPressed = true; } } if (acceleratorWasPressed) { - if ((accelerator != 0 && hxd.Key.isReleased(accelerator)) || Gamepad.isReleased(gamepadAccelerator)) + if ((accelerators.length != 0 && accelerators.map(x -> hxd.Key.isReleased(x)).contains(true)) + || Gamepad.isReleased(gamepadAccelerator)) acceleratorWasPressed = false; } super.update(dt, mouseState); diff --git a/src/gui/GuiXboxList.hx b/src/gui/GuiXboxList.hx index b69053ca..2d8eb600 100644 --- a/src/gui/GuiXboxList.hx +++ b/src/gui/GuiXboxList.hx @@ -1,9 +1,15 @@ package gui; +import src.Gamepad; +import hxd.Key; +import gui.GuiControl.MouseState; import h3d.Vector; class GuiXboxList extends GuiControl { var currentOffset:Float = 0; + var selected:Int = 0; + + var buttons:Array = []; public function new() { super(); @@ -14,8 +20,30 @@ class GuiXboxList extends GuiControl { btn.position = new Vector(0, currentOffset + addOffset); btn.extent = new Vector(502, 94); btn.pressedAction = func; + btn.list = this; this.addChild(btn); + buttons.push(btn); currentOffset += 60 + addOffset; return btn; } + + override function update(dt:Float, mouseState:MouseState) { + super.update(dt, mouseState); + + var prevSelected = selected; + if (Key.isPressed(Key.DOWN) || Gamepad.isPressed(["dpadDown"])) + selected++; + if (Key.isPressed(Key.UP) || Gamepad.isPressed(["dpadUp"])) + selected--; + if (selected < 0) + selected = buttons.length - 1; + if (selected >= buttons.length) + selected = 0; + if (prevSelected != selected) { + buttons[prevSelected].selected = false; + buttons[selected].selected = true; + } + if (Key.isPressed(Key.ENTER) || Gamepad.isPressed(["A"])) + buttons[selected].pressedAction(new GuiEvent(buttons[selected])); + } } diff --git a/src/gui/GuiXboxListButton.hx b/src/gui/GuiXboxListButton.hx index bb75e1a8..f9463ccd 100644 --- a/src/gui/GuiXboxListButton.hx +++ b/src/gui/GuiXboxListButton.hx @@ -20,12 +20,16 @@ class GuiXboxListButton extends GuiControl { public var disabled:Bool = false; public var pressed:Bool = false; + public var selected:Bool = false; public var buttonSounds:Bool = true; public var accelerator:Int = 0; public var gamepadAccelerator:Array = []; public var acceleratorWasPressed = false; + public var list:GuiXboxList; + + var _prevMousePos:Vector; public function new(icon:Int, text:String) { super(); @@ -76,7 +80,20 @@ class GuiXboxListButton extends GuiControl { AudioManager.playSound(ResourceLoader.getResource("data/sound/buttonpress.wav", ResourceLoader.getAudio, this.soundResources)); } } - if (renderRect.inRect(mouseState.position) && !disabled) { + if (_prevMousePos == null || !_prevMousePos.equals(mouseState.position)) { + if (renderRect.inRect(mouseState.position) && !selected) { + if (list != null) { + list.buttons[list.selected].selected = false; + list.selected = list.buttons.indexOf(this); + } + this.selected = true; + } + if (!renderRect.inRect(mouseState.position) && selected) { + this.selected = false; + } + _prevMousePos = mouseState.position.clone(); + } + if (selected && !disabled) { if (Key.isDown(Key.MOUSE_LEFT)) { this.button.anim.currentFrame = 1; this.buttonIcon.anim.currentFrame = 1; diff --git a/src/gui/HelpCreditsGui.hx b/src/gui/HelpCreditsGui.hx index a3d07344..a023daa4 100644 --- a/src/gui/HelpCreditsGui.hx +++ b/src/gui/HelpCreditsGui.hx @@ -142,7 +142,8 @@ class HelpCreditsGui extends GuiImage { backButton.position = new Vector(960, 0); backButton.vertSizing = Bottom; backButton.horizSizing = Right; - backButton.gamepadAccelerator = ["OK"]; + backButton.gamepadAccelerator = ["A"]; + backButton.accelerators = [hxd.Key.ENTER]; if (pauseGui) if (index == 5) backButton.pressedAction = (e) -> { diff --git a/src/gui/InputOptionsGui.hx b/src/gui/InputOptionsGui.hx index 9da80bf0..e21f30bb 100644 --- a/src/gui/InputOptionsGui.hx +++ b/src/gui/InputOptionsGui.hx @@ -143,7 +143,8 @@ class InputOptionsGui extends GuiImage { backButton.position = new Vector(960, 0); backButton.vertSizing = Bottom; backButton.horizSizing = Right; - backButton.gamepadAccelerator = ["OK"]; + backButton.gamepadAccelerator = ["A"]; + backButton.accelerators = [hxd.Key.ENTER]; if (pauseGui) backButton.pressedAction = (e) -> { Settings.applySettings(); diff --git a/src/gui/KeyBindingsGui.hx b/src/gui/KeyBindingsGui.hx index 20a05a0f..7b3053c5 100644 --- a/src/gui/KeyBindingsGui.hx +++ b/src/gui/KeyBindingsGui.hx @@ -181,6 +181,7 @@ class KeyBindingsGui extends GuiImage { backButton.vertSizing = Bottom; backButton.horizSizing = Right; backButton.gamepadAccelerator = ["B"]; + backButton.accelerators = [hxd.Key.ESCAPE, hxd.Key.BACKSPACE]; if (pauseGui) backButton.pressedAction = (e) -> { MarbleGame.canvas.popDialog(this); diff --git a/src/gui/LevelSelectGui.hx b/src/gui/LevelSelectGui.hx index 833d5308..7fa25378 100644 --- a/src/gui/LevelSelectGui.hx +++ b/src/gui/LevelSelectGui.hx @@ -136,6 +136,7 @@ class LevelSelectGui extends GuiImage { backButton.vertSizing = Bottom; backButton.horizSizing = Right; backButton.gamepadAccelerator = ["B"]; + backButton.accelerators = [hxd.Key.ESCAPE, hxd.Key.BACKSPACE]; backButton.pressedAction = (e) -> MarbleGame.canvas.setContent(new DifficultySelectGui()); bottomBar.addChild(backButton); @@ -143,6 +144,7 @@ class LevelSelectGui extends GuiImage { recordButton.position = new Vector(560, 0); recordButton.vertSizing = Bottom; recordButton.horizSizing = Right; + backButton.gamepadAccelerator = ["X"]; recordButton.pressedAction = (e) -> { MarbleGame.instance.toRecord = true; MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("The next mission you play will be recorded.")); @@ -159,6 +161,8 @@ class LevelSelectGui extends GuiImage { nextButton.position = new Vector(960, 0); nextButton.vertSizing = Bottom; nextButton.horizSizing = Right; + nextButton.gamepadAccelerator = ["A"]; + nextButton.accelerators = [hxd.Key.ENTER]; nextButton.pressedAction = (e) -> { MarbleGame.instance.playMission(curMission); }; diff --git a/src/gui/MarblePickerGui.hx b/src/gui/MarblePickerGui.hx index ed108671..4dff60d9 100644 --- a/src/gui/MarblePickerGui.hx +++ b/src/gui/MarblePickerGui.hx @@ -330,7 +330,8 @@ class MarblePickerGui extends GuiImage { backButton.position = new Vector(960, 0); backButton.vertSizing = Bottom; backButton.horizSizing = Right; - backButton.gamepadAccelerator = ["OK"]; + backButton.gamepadAccelerator = ["A"]; + backButton.accelerators = [hxd.Key.ENTER]; backButton.pressedAction = (e) -> { this.bmp.visible = true; MarbleGame.instance.setPreviewMission(prevPreview, () -> { diff --git a/src/gui/MessageBoxOkDlg.hx b/src/gui/MessageBoxOkDlg.hx index acc65da0..ffbfd96c 100644 --- a/src/gui/MessageBoxOkDlg.hx +++ b/src/gui/MessageBoxOkDlg.hx @@ -38,7 +38,7 @@ class MessageBoxOkDlg extends GuiImage { okButton.position = new Vector(211, 248); okButton.extent = new Vector(120, 94); okButton.vertSizing = Top; - okButton.accelerator = hxd.Key.ENTER; + okButton.accelerators = [hxd.Key.ENTER]; okButton.gamepadAccelerator = ["A"]; okButton.pressedAction = (sender) -> { MarbleGame.canvas.popDialog(this); diff --git a/src/gui/MessageBoxYesNoDlg.hx b/src/gui/MessageBoxYesNoDlg.hx index c46df13b..5372d232 100644 --- a/src/gui/MessageBoxYesNoDlg.hx +++ b/src/gui/MessageBoxYesNoDlg.hx @@ -38,7 +38,7 @@ class MessageBoxYesNoDlg extends GuiImage { okButton.position = new Vector(211, 248); okButton.extent = new Vector(120, 94); okButton.vertSizing = Top; - okButton.accelerator = hxd.Key.ENTER; + okButton.accelerators = [hxd.Key.ENTER]; okButton.gamepadAccelerator = ["A"]; okButton.pressedAction = (sender) -> { MarbleGame.canvas.popDialog(this); @@ -50,7 +50,7 @@ class MessageBoxYesNoDlg extends GuiImage { cancelButton.position = new Vector(321, 248); cancelButton.extent = new Vector(120, 94); cancelButton.vertSizing = Top; - cancelButton.accelerator = hxd.Key.ENTER; + cancelButton.accelerators = [hxd.Key.ESCAPE, hxd.Key.BACKSPACE]; cancelButton.gamepadAccelerator = ["A"]; cancelButton.pressedAction = (sender) -> { MarbleGame.canvas.popDialog(this); diff --git a/src/gui/MiscOptionsGui.hx b/src/gui/MiscOptionsGui.hx index a7be3bf8..3c415bd7 100644 --- a/src/gui/MiscOptionsGui.hx +++ b/src/gui/MiscOptionsGui.hx @@ -102,7 +102,8 @@ class MiscOptionsGui extends GuiImage { backButton.position = new Vector(960, 0); backButton.vertSizing = Bottom; backButton.horizSizing = Right; - backButton.gamepadAccelerator = ["OK"]; + backButton.gamepadAccelerator = ["A"]; + backButton.accelerators = [hxd.Key.ENTER]; if (pauseGui) backButton.pressedAction = (e) -> { Settings.applySettings(); diff --git a/src/gui/OptionsListGui.hx b/src/gui/OptionsListGui.hx index 8c607f8a..6d3f9360 100644 --- a/src/gui/OptionsListGui.hx +++ b/src/gui/OptionsListGui.hx @@ -103,6 +103,7 @@ class OptionsListGui extends GuiImage { backButton.vertSizing = Bottom; backButton.horizSizing = Right; backButton.gamepadAccelerator = ["B"]; + backButton.accelerators = [hxd.Key.ESCAPE, hxd.Key.BACKSPACE]; if (pauseGui) backButton.pressedAction = (e) -> { MarbleGame.canvas.popDialog(this); diff --git a/src/gui/ReplayCenterGui.hx b/src/gui/ReplayCenterGui.hx index aaf1bd76..ab17176c 100644 --- a/src/gui/ReplayCenterGui.hx +++ b/src/gui/ReplayCenterGui.hx @@ -131,6 +131,7 @@ class ReplayCenterGui extends GuiImage { backButton.vertSizing = Bottom; backButton.horizSizing = Right; backButton.gamepadAccelerator = ["B"]; + backButton.accelerators = [hxd.Key.ESCAPE, hxd.Key.BACKSPACE]; backButton.pressedAction = (e) -> MarbleGame.canvas.setContent(new MainMenuGui()); bottomBar.addChild(backButton); @@ -138,6 +139,8 @@ class ReplayCenterGui extends GuiImage { nextButton.position = new Vector(960, 0); nextButton.vertSizing = Bottom; nextButton.horizSizing = Right; + nextButton.gamepadAccelerator = ["A"]; + nextButton.accelerators = [hxd.Key.ENTER]; nextButton.pressedAction = (e) -> { if (selectedIdx != -1) { var repl = replayList[selectedIdx]; diff --git a/src/gui/ReplayNameDlg.hx b/src/gui/ReplayNameDlg.hx index cfb63fbb..c6caee69 100644 --- a/src/gui/ReplayNameDlg.hx +++ b/src/gui/ReplayNameDlg.hx @@ -63,7 +63,7 @@ class ReplayNameDlg extends GuiImage { okButton.position = new Vector(211, 248); okButton.extent = new Vector(120, 94); okButton.vertSizing = Top; - okButton.accelerator = hxd.Key.ENTER; + okButton.accelerators = [hxd.Key.ENTER]; okButton.gamepadAccelerator = ["A"]; okButton.pressedAction = (sender) -> { if (StringTools.trim(textInput.text.text) != "") { @@ -79,7 +79,7 @@ class ReplayNameDlg extends GuiImage { cancelButton.position = new Vector(321, 248); cancelButton.extent = new Vector(120, 94); cancelButton.vertSizing = Top; - cancelButton.accelerator = hxd.Key.ENTER; + cancelButton.accelerators = [hxd.Key.ENTER]; cancelButton.gamepadAccelerator = ["A"]; cancelButton.pressedAction = (sender) -> { MarbleGame.canvas.popDialog(this); diff --git a/src/gui/TouchCtrlsEditGui.hx b/src/gui/TouchCtrlsEditGui.hx index ae153a22..b280a396 100644 --- a/src/gui/TouchCtrlsEditGui.hx +++ b/src/gui/TouchCtrlsEditGui.hx @@ -60,6 +60,8 @@ class TouchCtrlsEditGui extends GuiImage { nextButton.position = new Vector(960, 100); nextButton.vertSizing = Bottom; nextButton.horizSizing = Right; + nextButton.gamepadAccelerator = ["A"]; + nextButton.accelerators = [hxd.Key.ENTER]; nextButton.pressedAction = (e) -> { if (paused) { MarbleGame.canvas.popDialog(this); diff --git a/src/gui/VersionGui.hx b/src/gui/VersionGui.hx index 454b5071..85c80bcd 100644 --- a/src/gui/VersionGui.hx +++ b/src/gui/VersionGui.hx @@ -72,7 +72,8 @@ class VersionGui extends GuiImage { backButton.position = new Vector(960, 0); backButton.vertSizing = Bottom; backButton.horizSizing = Right; - backButton.gamepadAccelerator = ["OK"]; + backButton.gamepadAccelerator = ["A"]; + backButton.accelerators = [hxd.Key.ENTER]; backButton.pressedAction = (e) -> MarbleGame.canvas.setContent(new MainMenuGui()); bottomBar.addChild(backButton); diff --git a/src/gui/VideoOptionsGui.hx b/src/gui/VideoOptionsGui.hx index dc43621a..24aea4e2 100644 --- a/src/gui/VideoOptionsGui.hx +++ b/src/gui/VideoOptionsGui.hx @@ -217,7 +217,8 @@ class VideoOptionsGui extends GuiImage { backButton.position = new Vector(960, 0); backButton.vertSizing = Bottom; backButton.horizSizing = Right; - backButton.gamepadAccelerator = ["OK"]; + backButton.gamepadAccelerator = ["A"]; + backButton.accelerators = [hxd.Key.ENTER]; if (pauseGui) backButton.pressedAction = (e) -> { Settings.applySettings();