From 5f54eff0385bbf9b34b74ab3906f6672ef441615 Mon Sep 17 00:00:00 2001 From: Felix Date: Wed, 20 Nov 2024 13:32:50 +0100 Subject: [PATCH] Add inputHandler --- .../java/pp/mdga/client/InputSyncronizer.java | 81 +++++++++++++++++++ .../src/main/java/pp/mdga/client/MdgaApp.java | 8 ++ .../java/pp/mdga/client/view/MainView.java | 2 +- .../java/pp/mdga/client/view/MdgaView.java | 48 ++++++++++- 4 files changed, 134 insertions(+), 5 deletions(-) create mode 100644 Projekte/mdga/client/src/main/java/pp/mdga/client/InputSyncronizer.java diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/InputSyncronizer.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/InputSyncronizer.java new file mode 100644 index 00000000..63271e5e --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/InputSyncronizer.java @@ -0,0 +1,81 @@ +package pp.mdga.client; + +import com.jme3.input.InputManager; +import com.jme3.input.KeyInput; +import com.jme3.input.MouseInput; +import com.jme3.input.controls.*; + +public class InputSyncronizer { + + private MdgaApp app; + private InputManager inputManager; + + protected boolean rightMousePressed = false; + private float rotationAngle = 0f; + private int scrollValue = 50; + + InputSyncronizer(MdgaApp app) { + this.app = app; + + this.inputManager = app.getInputManager(); + + setupInput(); + } + + public void update() { + rotateModel(); + updateScrollValue(); + } + + private void setupInput() { + inputManager.addMapping("Settings", new KeyTrigger(KeyInput.KEY_ESCAPE)); + + inputManager.addMapping("RotateRightMouse", new MouseButtonTrigger(MouseInput.BUTTON_RIGHT)); + inputManager.addMapping("MouseLeft", new MouseAxisTrigger(MouseInput.AXIS_X, false)); // Left movement + inputManager.addMapping("MouseRight", new MouseAxisTrigger(MouseInput.AXIS_X, true)); // Right movement + inputManager.addMapping("MouseScrollUp", new MouseAxisTrigger(MouseInput.AXIS_WHEEL, false)); // Scroll up + inputManager.addMapping("MouseScrollDown", new MouseAxisTrigger(MouseInput.AXIS_WHEEL, true)); // Scroll down + + inputManager.addListener(actionListener, "Settings", "RotateRightMouse"); + inputManager.addListener(analogListener, "MouseLeft", "MouseRight", "MouseScrollUp", "MouseScrollDown"); + } + + private final ActionListener actionListener = new ActionListener() { + @Override + public void onAction(String name, boolean isPressed, float tpf) { + if (name.equals("Settings") && isPressed) { + app.getView().pressEscape(); + } + if (name.equals("RotateRightMouse")) { + rightMousePressed = isPressed; + } + } + }; + + private final AnalogListener analogListener = new AnalogListener() { + @Override + public void onAnalog(String name, float value, float tpf) { + if (name.equals("MouseLeft") && rightMousePressed) { + rotationAngle -= value * 360f; + rotateModel(); + } else if (name.equals("MouseRight") && rightMousePressed) { + rotationAngle += value * 360f; + rotateModel(); + } else if (name.equals("MouseScrollUp")) { + scrollValue = Math.min(100, scrollValue + 1); + updateScrollValue(); + } else if (name.equals("MouseScrollDown")) { + scrollValue = Math.max(1, scrollValue - 1); + updateScrollValue(); + } + } + }; + + private void rotateModel() { + //System.out.println("Rotation Angle: " + rotationAngle); + } + + private void updateScrollValue() { + //System.out.println("Scroll Value: " + scrollValue); + } +} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java index 113097d3..b8bbb057 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java @@ -11,6 +11,7 @@ public class MdgaApp extends SimpleApplication { private AnimationHandler animationHandler; private AcousticHandler acousticHandler; private NotificationSynchronizer notificationSynchronizer; + private InputSyncronizer inputSyncronizer; MdgaView view = null; private MdgaState state = MdgaState.MAIN; @@ -41,7 +42,9 @@ public void simpleInitApp() { animationHandler = new AnimationHandler(this); acousticHandler = new AcousticHandler(this); notificationSynchronizer = new NotificationSynchronizer(this); + inputSyncronizer = new InputSyncronizer(this); + inputManager.deleteMapping("SIMPLEAPP_Exit"); GuiGlobals.initialize(this); enter(state); @@ -49,6 +52,7 @@ public void simpleInitApp() { @Override public void simpleUpdate(float tpf) { + inputSyncronizer.update(); view.update(); acousticHandler.update(); } @@ -95,4 +99,8 @@ public AcousticHandler getAcousticHandler() { public float getResolutionFactor() { return resolutionFactor; } + + public MdgaView getView() { + return view; + } } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/view/MainView.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/view/MainView.java index 7e8a9e27..d16bd0dc 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/view/MainView.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/view/MainView.java @@ -22,7 +22,7 @@ public MainView(MdgaApp app) { dialog = new InputButtonDialog(app, node); dialog.addButton("Spiel beitreten", () -> app.enter(MdgaState.LOBBY), size); dialog.addButton("Spiel hosten", () -> app.enter(MdgaState.LOBBY), size); - dialog.addButton("Einstellungen", () -> enterSettings(), size); + dialog.addButton("Einstellungen", () -> enterSettings(false), size); dialog.addButton("Spiel beenden", () -> app.stop(), size); } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/view/MdgaView.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/view/MdgaView.java index 4b3b2ebd..af15eb1d 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/view/MdgaView.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/view/MdgaView.java @@ -16,6 +16,10 @@ public abstract class MdgaView { protected MdgaApp app; protected Node node; + int depth = 0; + boolean isVideo = false; + boolean isAudio = false; + private Node settingsNode; private Node audioNode; private Node videoNode; @@ -38,7 +42,7 @@ public MdgaView(MdgaApp app) { this.audioNode = new Node(); this.videoNode = new Node(); - this.settingsButton = new SettingsButtonDialog(app, node, "", () -> enterSettings()); + this.settingsButton = new SettingsButtonDialog(app, node, "", () -> enterSettings(false)); this.settingsBackground = createBackground("background/zahnräder.png"); settingsNode.attachChild(settingsBackground); @@ -103,11 +107,15 @@ protected Geometry createBackground(String texturePath) { return background; } - protected void enterSettings() { + protected void enterSettings(boolean soft) { leave(); app.getGuiNode().attachChild(settingsNode); + if(!soft) { + depth++; + } + settings.show(); } @@ -118,12 +126,16 @@ protected void leaveSettings(boolean soft) { if(!soft) { enter(); + depth--; } } protected void enterAudio() { leaveSettings(true); + depth++; + isAudio = true; + app.getGuiNode().attachChild(audioNode); audio.show(); @@ -134,7 +146,10 @@ protected void leaveAudio() { app.getGuiNode().detachChild(audioNode); - enterSettings(); + isAudio = false; + depth--; + + enterSettings(true); } protected void enterVideo() { @@ -142,6 +157,10 @@ protected void enterVideo() { app.getGuiNode().attachChild(videoNode); + depth++; + + isVideo = true; + video.show(); } @@ -150,6 +169,27 @@ protected void leaveVideo() { app.getGuiNode().detachChild(videoNode); - enterSettings(); + depth--; + isVideo = false; + + enterSettings(true); + } + + public void pressEscape() { + if(depth == 0) { + enterSettings(false); + } else if(depth == 1) { + leaveSettings(false); + } + else if (depth == 2){ + if(isVideo) { + leaveVideo(); + } + if(isAudio) { + leaveAudio(); + } + } else { + throw new RuntimeException(); + } } }