From fe759d7b28ef04bc789537c8b84017f7d28d4e2d Mon Sep 17 00:00:00 2001 From: josua Date: Fri, 6 Dec 2019 13:17:47 +1100 Subject: [PATCH] Added controller support to the GUI buttons --- .../input/CursorPosCallback.java | 1 + src/projectzombie/input/GameInput.java | 1 + src/projectzombie/input/InputMode.java | 5 ++ src/projectzombie/input/JoystickCallback.java | 23 +++++++ src/projectzombie/input/KeyCallback.java | 2 + src/projectzombie/input/KeyCharCallback.java | 3 +- .../input/MouseButtonCallback.java | 2 + .../input/ScrollWheelCallback.java | 2 + src/projectzombie/input/types/Input.java | 1 + src/projectzombie/input/types/InputGUI.java | 7 +- src/projectzombie/input/types/InputGame.java | 4 ++ src/projectzombie/menu/MenuGamePause.java | 7 +- src/projectzombie/menu/MenuMain.java | 1 + src/projectzombie/menu/MenuSettings.java | 12 +++- src/projectzombie/menu/gui/Button.java | 60 ++++++++++++++++- src/projectzombie/menu/gui/ButtonGroup.java | 23 +++++++ src/projectzombie/menu/gui/GUI.java | 66 ++++++++++++++++++- src/projectzombie/menu/gui/GUIComponent.java | 1 + src/projectzombie/menu/gui/GUISelectable.java | 8 +++ .../menu/gui/GUISelectableDirection.java | 5 ++ src/projectzombie/menu/gui/Label.java | 6 +- src/projectzombie/menu/gui/Overlay.java | 4 ++ .../menu/gui/components/LabelPause.java | 2 - 23 files changed, 231 insertions(+), 15 deletions(-) create mode 100644 src/projectzombie/input/InputMode.java create mode 100644 src/projectzombie/menu/gui/GUISelectable.java create mode 100644 src/projectzombie/menu/gui/GUISelectableDirection.java diff --git a/src/projectzombie/input/CursorPosCallback.java b/src/projectzombie/input/CursorPosCallback.java index 66c4e76..da2d1f9 100644 --- a/src/projectzombie/input/CursorPosCallback.java +++ b/src/projectzombie/input/CursorPosCallback.java @@ -12,6 +12,7 @@ public class CursorPosCallback implements GLFWCursorPosCallbackI public void invoke(long window, double x, double y) { Main.menu.input.mousePos(new Vec2d(x, y)); Main.window.setMouseVisibility(!Main.menu.keepMouse); + InputMode.Controller = false; if(!Main.menu.keepMouse) { return; diff --git a/src/projectzombie/input/GameInput.java b/src/projectzombie/input/GameInput.java index f207348..e8954ef 100644 --- a/src/projectzombie/input/GameInput.java +++ b/src/projectzombie/input/GameInput.java @@ -12,6 +12,7 @@ class GameInput static boolean startButton_last = false; static boolean backButton_last = false; + static boolean activate_last = false; static boolean moveLeft = false; static boolean moveRight = false; diff --git a/src/projectzombie/input/InputMode.java b/src/projectzombie/input/InputMode.java new file mode 100644 index 0000000..9818b8f --- /dev/null +++ b/src/projectzombie/input/InputMode.java @@ -0,0 +1,5 @@ +package projectzombie.input; + +public class InputMode { + public static boolean Controller = false; +} diff --git a/src/projectzombie/input/JoystickCallback.java b/src/projectzombie/input/JoystickCallback.java index ae97a5f..7de9577 100644 --- a/src/projectzombie/input/JoystickCallback.java +++ b/src/projectzombie/input/JoystickCallback.java @@ -151,6 +151,7 @@ public class JoystickCallback implements GLFWJoystickCallbackI, IMainloopTask input.move(true, angle); move_last = true; + InputMode.Controller = true; Main.window.setMouseVisibility(false); } @@ -163,17 +164,20 @@ public class JoystickCallback implements GLFWJoystickCallbackI, IMainloopTask // Is the right x axis stick moved into a position (camera stick) if(right_x > 0.3 || right_x < -0.3) { input.camera(true, right_x); + InputMode.Controller = true; Main.window.setMouseVisibility(false); } // Gun trigger if(right_trigger > 0.3 && !fireGun) { input.fire(true); + InputMode.Controller = true; Main.window.setMouseVisibility(false); } // Item trigger if(left_trigger > 0.3) { + InputMode.Controller = true; Main.window.setMouseVisibility(false); if(!activateItem_last) { @@ -187,6 +191,7 @@ public class JoystickCallback implements GLFWJoystickCallbackI, IMainloopTask } if(shoulder_left) { + InputMode.Controller = true; Main.window.setMouseVisibility(false); if(!hotbar_l) { hotbar_l = true; @@ -199,6 +204,7 @@ public class JoystickCallback implements GLFWJoystickCallbackI, IMainloopTask } if(shoulder_right) { + InputMode.Controller = true; Main.window.setMouseVisibility(false); if(!hotbar_r) { hotbar_r = true; @@ -212,6 +218,7 @@ public class JoystickCallback implements GLFWJoystickCallbackI, IMainloopTask // Activate tile if(button_x) { + InputMode.Controller = true; Main.window.setMouseVisibility(false); if(!activateTile_last) { input.activateTile(true); @@ -223,8 +230,23 @@ public class JoystickCallback implements GLFWJoystickCallbackI, IMainloopTask activateTile_last = false; } + // Activate button (A Button) + if(button_a) { + InputMode.Controller = true; + Main.window.setMouseVisibility(false); + if(!activate_last) { + input.activate(true); + activate_last = true; + } + } + + else if(activate_last) { + activate_last = false; + } + // Drop item if(button_b) { + InputMode.Controller = true; Main.window.setMouseVisibility(false); if(!dropItem_last) { input.itemDrop(true); @@ -251,6 +273,7 @@ public class JoystickCallback implements GLFWJoystickCallbackI, IMainloopTask // Pause the game if(button_start) { Main.window.setMouseVisibility(false); + InputMode.Controller = true; if(!startButton_last) { startButton_last = true; input.pause(true); diff --git a/src/projectzombie/input/KeyCallback.java b/src/projectzombie/input/KeyCallback.java index 238584b..9a35196 100644 --- a/src/projectzombie/input/KeyCallback.java +++ b/src/projectzombie/input/KeyCallback.java @@ -24,6 +24,8 @@ public class KeyCallback implements GLFWKeyCallbackI, IMainloopTask Input input = Main.menu.input; boolean pressed = ! ( action == GLFW_RELEASE ); + InputMode.Controller = false; + if(key == GLFW_KEY_W) { moveUp = pressed; } diff --git a/src/projectzombie/input/KeyCharCallback.java b/src/projectzombie/input/KeyCharCallback.java index c872bd4..611d57d 100644 --- a/src/projectzombie/input/KeyCharCallback.java +++ b/src/projectzombie/input/KeyCharCallback.java @@ -7,8 +7,7 @@ public class KeyCharCallback implements GLFWCharCallbackI @Override public void invoke(long arg0, int arg1) { - // TODO Auto-generated method stub - + InputMode.Controller = false; } } diff --git a/src/projectzombie/input/MouseButtonCallback.java b/src/projectzombie/input/MouseButtonCallback.java index 46d816e..69ef006 100644 --- a/src/projectzombie/input/MouseButtonCallback.java +++ b/src/projectzombie/input/MouseButtonCallback.java @@ -11,6 +11,8 @@ public class MouseButtonCallback implements GLFWMouseButtonCallbackI @Override public void invoke(long window, int button, int action, int mods) { + InputMode.Controller = false; + if(button == GLFW.GLFW_MOUSE_BUTTON_LEFT) { GameInput.fireGun = action == 1; } diff --git a/src/projectzombie/input/ScrollWheelCallback.java b/src/projectzombie/input/ScrollWheelCallback.java index 055d45f..500587e 100644 --- a/src/projectzombie/input/ScrollWheelCallback.java +++ b/src/projectzombie/input/ScrollWheelCallback.java @@ -10,6 +10,8 @@ public class ScrollWheelCallback implements GLFWScrollCallbackI @Override public void invoke(long window, double x, double y) { + InputMode.Controller = false; + if(y > 0) { Main.menu.input.hotbarShift(true, 1); } if(y < 0) { diff --git a/src/projectzombie/input/types/Input.java b/src/projectzombie/input/types/Input.java index 2fc1428..320c01e 100644 --- a/src/projectzombie/input/types/Input.java +++ b/src/projectzombie/input/types/Input.java @@ -15,4 +15,5 @@ public interface Input public void hotbarShift(boolean state, int amount); public void mousePos(Vec2d pos); public void back(boolean state); + public void activate(boolean state); } diff --git a/src/projectzombie/input/types/InputGUI.java b/src/projectzombie/input/types/InputGUI.java index 9ed8273..00126a3 100644 --- a/src/projectzombie/input/types/InputGUI.java +++ b/src/projectzombie/input/types/InputGUI.java @@ -14,7 +14,7 @@ public class InputGUI implements Input @Override public void move(boolean state, double angle) { - this.gui.onMove(angle); + this.gui.onMove(state, angle); } @Override @@ -59,5 +59,10 @@ public class InputGUI implements Input public void back(boolean state) { gui.onBack(); } + + @Override + public void activate(boolean state) { + gui.onActivate(); + } } diff --git a/src/projectzombie/input/types/InputGame.java b/src/projectzombie/input/types/InputGame.java index 6bb49c3..3a7ac5a 100644 --- a/src/projectzombie/input/types/InputGame.java +++ b/src/projectzombie/input/types/InputGame.java @@ -74,5 +74,9 @@ public class InputGame implements Input @Override public void back(boolean state) { } + + @Override + public void activate(boolean state) { + } } diff --git a/src/projectzombie/menu/MenuGamePause.java b/src/projectzombie/menu/MenuGamePause.java index 57316a0..8e30e44 100644 --- a/src/projectzombie/menu/MenuGamePause.java +++ b/src/projectzombie/menu/MenuGamePause.java @@ -4,12 +4,10 @@ import projectzombie.Main; import projectzombie.input.types.InputGUI; import projectzombie.menu.gui.ButtonGroup; import projectzombie.menu.gui.GUI; -import projectzombie.menu.gui.components.ButtonBasic; import projectzombie.menu.gui.components.ButtonGroupPause; import projectzombie.menu.gui.components.GUIBackToMenu; import projectzombie.menu.gui.components.LabelPause; import projectzombie.menu.gui.components.OverlayBackground; -import projectzombie.util.math.vec.Vec2d; public class MenuGamePause extends Menu { @@ -25,7 +23,10 @@ public class MenuGamePause extends Menu gui.add(new OverlayBackground()); gui.add(new LabelPause("Game Paused")); - gui.add(new ButtonGroupPause()); + + ButtonGroup group = new ButtonGroupPause(); + gui.setSelected(group.get(0)); + gui.add(group); } @Override diff --git a/src/projectzombie/menu/MenuMain.java b/src/projectzombie/menu/MenuMain.java index 6b0fc46..048a305 100644 --- a/src/projectzombie/menu/MenuMain.java +++ b/src/projectzombie/menu/MenuMain.java @@ -38,6 +38,7 @@ public class MenuMain extends Menu })); gui.add(group); + gui.setSelected(group.get(0)); Main.respawn(); Main.player.dead = true; diff --git a/src/projectzombie/menu/MenuSettings.java b/src/projectzombie/menu/MenuSettings.java index 349984e..e980253 100644 --- a/src/projectzombie/menu/MenuSettings.java +++ b/src/projectzombie/menu/MenuSettings.java @@ -3,8 +3,10 @@ package projectzombie.menu; import projectzombie.Main; import projectzombie.display.DisplayRenderUI; import projectzombie.input.types.InputGUI; +import projectzombie.menu.gui.Button; import projectzombie.menu.gui.ButtonGroup; import projectzombie.menu.gui.GUI; +import projectzombie.menu.gui.GUISelectableDirection; import projectzombie.menu.gui.Label; import projectzombie.menu.gui.components.ButtonBasic; import projectzombie.menu.gui.components.ButtonSetting; @@ -78,9 +80,15 @@ public class MenuSettings extends Menu labelSettings.setPos(new Vec2d(0, 6.8)); gui.add(labelSettings); - gui.add(new ButtonBasic("Back", new Vec2d(0, -8), button -> { + Button buttonBack = new ButtonBasic("Back", new Vec2d(0, -8), button -> { Main.menu = menuOld; - })); + }); + + group.get(group.size() - 1).setNeighbour(buttonBack, GUISelectableDirection.DOWN); + buttonBack.setNeighbour(group.get(group.size() - 1), GUISelectableDirection.UP); + + gui.add(buttonBack); + gui.setSelected(buttonBack); } @Override diff --git a/src/projectzombie/menu/gui/Button.java b/src/projectzombie/menu/gui/Button.java index 305d2ec..c18fcd8 100644 --- a/src/projectzombie/menu/gui/Button.java +++ b/src/projectzombie/menu/gui/Button.java @@ -2,17 +2,22 @@ package projectzombie.menu.gui; import projectzombie.Main; import projectzombie.init.Textures; +import projectzombie.input.InputMode; import projectzombie.text.Text; import projectzombie.util.gl.GlHelpers; import projectzombie.util.gl.texture.TextureReference; import projectzombie.util.math.vec.Vec2d; -public class Button implements GUIComponent +public class Button implements GUIComponent, GUISelectable { private Vec2d pos = new Vec2d(0, 0); private String text = ""; private Alignment alignment = Alignment.CENTRE; + private boolean selected = false; + + private GUISelectable[] SELECTABLE = {null, null, null, null}; + public static final Vec2d textSize = new Vec2d(0.5, 0.5); public void setPos(Vec2d pos) { @@ -59,7 +64,7 @@ public class Button implements GUIComponent } TextureReference tex; - boolean mouseHover = this.checkMouseHover(mousePos); + boolean mouseHover = InputMode.Controller ? this.selected : this.checkMouseHover(mousePos); if(mouseHover) { tex = Textures.BUTTON_HOVER; } else { @@ -133,4 +138,55 @@ public class Button implements GUIComponent @Override public void onBack() { } + + @Override + public void setSelected(boolean status) { + this.selected = status; + } + + @Override + public boolean getSelected() { + return this.selected; + } + + @Override + public GUISelectable getNeighbour(GUISelectableDirection direction) { + if(direction == GUISelectableDirection.UP) { + return SELECTABLE[0]; + } + if(direction == GUISelectableDirection.LEFT) { + return SELECTABLE[1]; + } + if(direction == GUISelectableDirection.DOWN) { + return SELECTABLE[2]; + } + if(direction == GUISelectableDirection.RIGHT) { + return SELECTABLE[3]; + } + + return null; + } + + @Override + public void setNeighbour(GUISelectable selectable, GUISelectableDirection direction) { + if(direction == GUISelectableDirection.UP) { + SELECTABLE[0] = selectable; + } + if(direction == GUISelectableDirection.LEFT) { + SELECTABLE[1] = selectable; + } + if(direction == GUISelectableDirection.DOWN) { + SELECTABLE[2] = selectable; + } + if(direction == GUISelectableDirection.RIGHT) { + SELECTABLE[3] = selectable; + } + } + + @Override + public void onActivate() { + if(this.selected) { + this.onMouseClick(new Vec2d(0, 0)); + } + } } diff --git a/src/projectzombie/menu/gui/ButtonGroup.java b/src/projectzombie/menu/gui/ButtonGroup.java index 75a8514..a8e620d 100644 --- a/src/projectzombie/menu/gui/ButtonGroup.java +++ b/src/projectzombie/menu/gui/ButtonGroup.java @@ -15,6 +15,14 @@ public class ButtonGroup implements GUIContainer for(int i=0;i 0) { + b.setNeighbour(buttons.get(i - 1), GUISelectableDirection.UP); + } + + if(i < buttons.size() - 1) { + b.setNeighbour(buttons.get(i + 1), GUISelectableDirection.DOWN); + } } } @@ -59,5 +67,20 @@ public class ButtonGroup implements GUIContainer b.onBack(); } } + + public Button get(int n) { + return buttons.get(n); + } + + public int size() { + return buttons.size(); + } + + @Override + public void onActivate() { + for(Button b : buttons) { + b.onActivate(); + } + } } diff --git a/src/projectzombie/menu/gui/GUI.java b/src/projectzombie/menu/gui/GUI.java index c966653..0c58664 100644 --- a/src/projectzombie/menu/gui/GUI.java +++ b/src/projectzombie/menu/gui/GUI.java @@ -2,7 +2,6 @@ package projectzombie.menu.gui; import java.util.ArrayList; -import projectzombie.menu.Menu; import projectzombie.util.math.vec.Vec2d; public class GUI implements GUIContainer @@ -10,6 +9,20 @@ public class GUI implements GUIContainer private ArrayList components = new ArrayList(); private Vec2d mousePos = new Vec2d(0, 0); + public GUISelectable selected; + + private static boolean move_last = false; + + public void setSelected(GUISelectable selected) { + if(this.selected != null) { + this.selected.setSelected(false); + } + this.selected = selected; + if(this.selected != null) { + this.selected.setSelected(true); + } + } + @Override public void render(Vec2d mousePos) { for(GUIComponent c : components) { @@ -30,8 +43,50 @@ public class GUI implements GUIContainer this.mousePos = pos; } - public void onMove(double angle) { + public void onMove(boolean status, double angle) + { + if(this.selected == null) { + return; + } + if(status) { + if(!move_last) { + move_last = true; + + this.selected.setSelected(false); + GUISelectable selected = null; + + // Up / North + if(angle > 315 || angle <= 45) { + selected = this.selected.getNeighbour(GUISelectableDirection.UP); + } + + // Right / East + if(angle > 45 && angle <= 135) { + selected = this.selected.getNeighbour(GUISelectableDirection.RIGHT); + } + + // Down / South + if(angle > 135 && angle <= 225) { + selected = this.selected.getNeighbour(GUISelectableDirection.DOWN); + } + + // Left / West + if(angle > 225 && angle <= 315) { + selected = this.selected.getNeighbour(GUISelectableDirection.LEFT); + } + + if(selected != null) { + this.selected = selected; + } + + this.selected.setSelected(true); + } + } + + else if(move_last) { + move_last = false; + } } @Override @@ -59,4 +114,11 @@ public class GUI implements GUIContainer } } + @Override + public void onActivate() { + for(GUIComponent c : components) { + c.onActivate(); + } + } + } diff --git a/src/projectzombie/menu/gui/GUIComponent.java b/src/projectzombie/menu/gui/GUIComponent.java index 55fbbe0..0cb154f 100644 --- a/src/projectzombie/menu/gui/GUIComponent.java +++ b/src/projectzombie/menu/gui/GUIComponent.java @@ -9,5 +9,6 @@ public interface GUIComponent public boolean checkMouseHover(Vec2d pos); public void onMouseClick(Vec2d pos); + public void onActivate(); public void onBack(); } diff --git a/src/projectzombie/menu/gui/GUISelectable.java b/src/projectzombie/menu/gui/GUISelectable.java new file mode 100644 index 0000000..3b70139 --- /dev/null +++ b/src/projectzombie/menu/gui/GUISelectable.java @@ -0,0 +1,8 @@ +package projectzombie.menu.gui; + +public interface GUISelectable { + public void setSelected(boolean status); + public boolean getSelected(); + public GUISelectable getNeighbour(GUISelectableDirection direction); + public void setNeighbour(GUISelectable selectable, GUISelectableDirection direction); +} diff --git a/src/projectzombie/menu/gui/GUISelectableDirection.java b/src/projectzombie/menu/gui/GUISelectableDirection.java new file mode 100644 index 0000000..39fd21e --- /dev/null +++ b/src/projectzombie/menu/gui/GUISelectableDirection.java @@ -0,0 +1,5 @@ +package projectzombie.menu.gui; + +public enum GUISelectableDirection { + UP, DOWN, LEFT, RIGHT +} diff --git a/src/projectzombie/menu/gui/Label.java b/src/projectzombie/menu/gui/Label.java index 927843f..c948688 100644 --- a/src/projectzombie/menu/gui/Label.java +++ b/src/projectzombie/menu/gui/Label.java @@ -9,7 +9,7 @@ public class Label implements GUIComponent { private Vec2d pos = new Vec2d(0, 0); private Vec2d size = new Vec2d(0.5, 0.5); - private Vec3d color = new Vec3d(1, 1, 1); + private Vec3d color = new Vec3d(0.92, 0.92, 0.92); private String text = ""; private Alignment alignment = Alignment.CENTRE; @@ -61,5 +61,9 @@ public class Label implements GUIComponent @Override public void onBack() { } + + @Override + public void onActivate() { + } } diff --git a/src/projectzombie/menu/gui/Overlay.java b/src/projectzombie/menu/gui/Overlay.java index 7819342..53fcea6 100644 --- a/src/projectzombie/menu/gui/Overlay.java +++ b/src/projectzombie/menu/gui/Overlay.java @@ -44,4 +44,8 @@ public class Overlay implements GUIComponent public void onBack() { } + @Override + public void onActivate() { + } + } diff --git a/src/projectzombie/menu/gui/components/LabelPause.java b/src/projectzombie/menu/gui/components/LabelPause.java index 6a7745f..ce32c36 100644 --- a/src/projectzombie/menu/gui/components/LabelPause.java +++ b/src/projectzombie/menu/gui/components/LabelPause.java @@ -2,7 +2,6 @@ package projectzombie.menu.gui.components; import projectzombie.menu.gui.Label; import projectzombie.util.math.vec.Vec2d; -import projectzombie.util.math.vec.Vec3d; public class LabelPause extends Label { @@ -10,6 +9,5 @@ public class LabelPause extends Label setText(text); setPos(new Vec2d(0, 2.4)); setSize(new Vec2d(1, 1)); - setColor(new Vec3d(0.92, 0.92, 0.92)); } }