From 3c06b914e3573daa8682c03d44bdf8e0c297bc4a Mon Sep 17 00:00:00 2001 From: Quillraven Date: Fri, 30 May 2025 23:58:02 +0200 Subject: [PATCH] add idle controller state --- .../io/github/com/quillraven/GdxGame.java | 3 ++- .../quillraven/input/IdleControllerState.java | 11 +++++++++ .../quillraven/input/KeyboardController.java | 24 ++++++++++++++++--- .../com/quillraven/screen/GameScreen.java | 8 ++++--- 4 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 core/src/main/java/io/github/com/quillraven/input/IdleControllerState.java diff --git a/core/src/main/java/io/github/com/quillraven/GdxGame.java b/core/src/main/java/io/github/com/quillraven/GdxGame.java index 2dc6f09..d432b1f 100644 --- a/core/src/main/java/io/github/com/quillraven/GdxGame.java +++ b/core/src/main/java/io/github/com/quillraven/GdxGame.java @@ -18,6 +18,7 @@ import io.github.com.quillraven.asset.AssetService; import io.github.com.quillraven.screen.LoadingScreen; import java.util.HashMap; +import java.util.Map; public class GdxGame extends Game { public static final float WORLD_HEIGHT = 9f; @@ -31,7 +32,7 @@ public class GdxGame extends Game { private GLProfiler glProfiler; private InputMultiplexer inputMultiplexer; - private final HashMap, Screen> screenCache = new HashMap<>(); + private final Map, Screen> screenCache = new HashMap<>(); @Override public void create() { diff --git a/core/src/main/java/io/github/com/quillraven/input/IdleControllerState.java b/core/src/main/java/io/github/com/quillraven/input/IdleControllerState.java new file mode 100644 index 0000000..428f4d9 --- /dev/null +++ b/core/src/main/java/io/github/com/quillraven/input/IdleControllerState.java @@ -0,0 +1,11 @@ +package io.github.com.quillraven.input; + +public class IdleControllerState implements ControllerState { + @Override + public void keyDown(Command command) { + } + + @Override + public void keyUp(Command command) { + } +} diff --git a/core/src/main/java/io/github/com/quillraven/input/KeyboardController.java b/core/src/main/java/io/github/com/quillraven/input/KeyboardController.java index 84bca73..8678cca 100644 --- a/core/src/main/java/io/github/com/quillraven/input/KeyboardController.java +++ b/core/src/main/java/io/github/com/quillraven/input/KeyboardController.java @@ -1,8 +1,12 @@ package io.github.com.quillraven.input; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.utils.ImmutableArray; import com.badlogic.gdx.Input; import com.badlogic.gdx.InputAdapter; +import com.badlogic.gdx.utils.GdxRuntimeException; +import java.util.HashMap; import java.util.Map; public class KeyboardController extends InputAdapter { @@ -14,18 +18,32 @@ public class KeyboardController extends InputAdapter { ); private final boolean[] commandState; + private final Map, ControllerState> stateCache; private ControllerState activeState; - public KeyboardController(ControllerState initialState) { + public KeyboardController(Class initialState, ImmutableArray controllerEntities) { this.commandState = new boolean[Command.values().length]; + this.stateCache = new HashMap<>(); + this.activeState = null; + + this.stateCache.put(IdleControllerState.class, new IdleControllerState()); + this.stateCache.put(GameControllerState.class, new GameControllerState(controllerEntities)); setActiveState(initialState); } - public void setActiveState(ControllerState controllerState) { + public void setActiveState(Class stateClass) { + ControllerState state = stateCache.get(stateClass); + if (state == null) { + throw new GdxRuntimeException("State " + stateClass.getSimpleName() + " not found in cache"); + } + for (Command command : Command.values()) { + if (this.activeState != null && this.commandState[command.ordinal()]) { + this.activeState.keyUp(command); + } this.commandState[command.ordinal()] = false; } - this.activeState = controllerState; + this.activeState = state; } @Override diff --git a/core/src/main/java/io/github/com/quillraven/screen/GameScreen.java b/core/src/main/java/io/github/com/quillraven/screen/GameScreen.java index d8b9f0d..c867296 100644 --- a/core/src/main/java/io/github/com/quillraven/screen/GameScreen.java +++ b/core/src/main/java/io/github/com/quillraven/screen/GameScreen.java @@ -34,6 +34,7 @@ public class GameScreen extends ScreenAdapter { private final Engine engine; private final TiledAshleySpawner tiledAshleySpawner; private final World physicWorld; + private final KeyboardController keyboardController; public GameScreen(GdxGame game) { this.game = game; @@ -42,6 +43,8 @@ public class GameScreen extends ScreenAdapter { this.physicWorld.setAutoClearForces(false); this.engine = new Engine(); this.tiledAshleySpawner = new TiledAshleySpawner(this.engine, this.physicWorld); + ImmutableArray controllerEntities = this.engine.getEntitiesFor(Family.all(Controller.class).get()); + this.keyboardController = new KeyboardController(GameControllerState.class, controllerEntities); // add ECS systems this.engine.addSystem(new PhysicMoveSystem()); @@ -57,9 +60,8 @@ public class GameScreen extends ScreenAdapter { @Override public void show() { this.game.getInputMultiplexer().clear(); - ImmutableArray controllerEntities = this.engine.getEntitiesFor(Family.all(Controller.class).get()); - GameControllerState gameControllerState = new GameControllerState(controllerEntities); - this.game.getInputMultiplexer().addProcessor(new KeyboardController(gameControllerState)); + this.game.getInputMultiplexer().addProcessor(keyboardController); + keyboardController.setActiveState(GameControllerState.class); Consumer renderConsumer = this.engine.getSystem(RenderSystem.class)::setMap; Consumer ashleySpawnerConsumer = this.tiledAshleySpawner::loadMapObjects;