diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/context/Context.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/context/Context.java index caaf704e..1d448db2 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/context/Context.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/context/Context.java @@ -4,6 +4,7 @@ import com.bartlomiejpluta.base.api.game.camera.Camera; import com.bartlomiejpluta.base.api.game.entity.Entity; import com.bartlomiejpluta.base.api.game.gui.base.GUI; import com.bartlomiejpluta.base.api.game.image.Image; +import com.bartlomiejpluta.base.api.game.input.Input; import com.bartlomiejpluta.base.api.game.runner.GameRunner; import com.bartlomiejpluta.base.api.game.screen.Screen; import com.bartlomiejpluta.base.api.internal.gc.Disposable; @@ -17,6 +18,8 @@ public interface Context extends Updatable, Renderable, Disposable { Camera getCamera(); + Input getInput(); + String getProjectName(); void openMap(String mapUid); @@ -39,7 +42,7 @@ public interface Context extends Updatable, Renderable, Disposable { boolean togglePause(); - void init(Screen screen, Camera camera); + void init(Screen screen, Input input, Camera camera); - void input(Screen screen); + void input(Input input); } diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/input/Input.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/input/Input.java new file mode 100644 index 00000000..2059cbd8 --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/input/Input.java @@ -0,0 +1,5 @@ +package com.bartlomiejpluta.base.api.game.input; + +public interface Input { + boolean isKeyPressed(Key key); +} diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/map/handler/MapHandler.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/map/handler/MapHandler.java index ad4de1ef..eebd5643 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/map/handler/MapHandler.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/map/handler/MapHandler.java @@ -1,6 +1,7 @@ package com.bartlomiejpluta.base.api.game.map.handler; import com.bartlomiejpluta.base.api.game.context.Context; +import com.bartlomiejpluta.base.api.game.input.Input; import com.bartlomiejpluta.base.api.game.map.model.GameMap; import com.bartlomiejpluta.base.api.game.screen.Screen; @@ -9,7 +10,7 @@ public interface MapHandler { void onOpen(Context context, GameMap map); - void input(Screen screen); + void input(Input input); void update(Context context, GameMap map, float dt); diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/runner/GameRunner.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/runner/GameRunner.java index 55900a76..858dcb68 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/runner/GameRunner.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/runner/GameRunner.java @@ -1,13 +1,13 @@ package com.bartlomiejpluta.base.api.game.runner; import com.bartlomiejpluta.base.api.game.context.Context; -import com.bartlomiejpluta.base.api.game.screen.Screen; +import com.bartlomiejpluta.base.api.game.input.Input; import com.bartlomiejpluta.base.api.internal.gc.Disposable; public interface GameRunner extends Disposable { void init(Context context); - void input(Screen screen); + void input(Input input); void update(float dt); } diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/screen/Screen.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/screen/Screen.java index 87ee3c1a..4c9b1b6e 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/screen/Screen.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/screen/Screen.java @@ -1,6 +1,5 @@ package com.bartlomiejpluta.base.api.game.screen; -import com.bartlomiejpluta.base.api.game.input.Key; import org.joml.Vector2fc; public interface Screen { @@ -18,8 +17,6 @@ public interface Screen { boolean shouldClose(); - boolean isKeyPressed(Key key); - void update(); void clear(float r, float g, float b, float alpha); diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/context/model/DefaultContext.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/context/model/DefaultContext.java index cce3d791..e9847d8d 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/context/model/DefaultContext.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/context/model/DefaultContext.java @@ -5,6 +5,7 @@ import com.bartlomiejpluta.base.api.game.context.Context; import com.bartlomiejpluta.base.api.game.entity.Entity; import com.bartlomiejpluta.base.api.game.gui.base.GUI; import com.bartlomiejpluta.base.api.game.image.Image; +import com.bartlomiejpluta.base.api.game.input.Input; import com.bartlomiejpluta.base.api.game.map.handler.MapHandler; import com.bartlomiejpluta.base.api.game.runner.GameRunner; import com.bartlomiejpluta.base.api.game.screen.Screen; @@ -52,6 +53,9 @@ public class DefaultContext implements Context { @NonNull private final String projectName; + @Getter + private Input input; + @Getter private Screen screen; @@ -65,8 +69,9 @@ public class DefaultContext implements Context { @SneakyThrows @Override - public void init(@NonNull Screen screen, @NonNull Camera camera) { + public void init(@NonNull Screen screen, @NonNull Input input, @NonNull Camera camera) { this.screen = screen; + this.input = input; this.camera = camera; gameRunner.init(this); @@ -132,11 +137,11 @@ public class DefaultContext implements Context { } @Override - public void input(Screen screen) { - gameRunner.input(screen); + public void input(Input input) { + gameRunner.input(input); if (mapHandler != null) { - mapHandler.input(screen); + mapHandler.input(input); } } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/core/engine/DefaultGameEngine.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/core/engine/DefaultGameEngine.java index f59f30c3..1e314a86 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/core/engine/DefaultGameEngine.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/core/engine/DefaultGameEngine.java @@ -1,12 +1,14 @@ package com.bartlomiejpluta.base.engine.core.engine; import com.bartlomiejpluta.base.api.game.context.Context; +import com.bartlomiejpluta.base.api.game.input.Input; import com.bartlomiejpluta.base.api.game.screen.Screen; import com.bartlomiejpluta.base.engine.gc.OffHeapGarbageCollector; import com.bartlomiejpluta.base.engine.logic.GameLogic; import com.bartlomiejpluta.base.engine.thread.ThreadManager; import com.bartlomiejpluta.base.engine.time.ChronoMeter; -import com.bartlomiejpluta.base.engine.ui.ScreenManager; +import com.bartlomiejpluta.base.engine.ui.manager.InputManager; +import com.bartlomiejpluta.base.engine.ui.manager.ScreenManager; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -20,6 +22,7 @@ public class DefaultGameEngine implements GameEngine { private static final String THREAD_NAME = "engine"; private final ScreenManager screenManager; + private final InputManager inputManager; private final ThreadManager threadManager; private final GameLogic logic; private final OffHeapGarbageCollector garbageCollector; @@ -28,6 +31,7 @@ public class DefaultGameEngine implements GameEngine { private Thread thread; private Screen screen; + private Input input; private int targetUps; private Context context; @@ -81,7 +85,7 @@ public class DefaultGameEngine implements GameEngine { } private void input() { - logic.input(screen); + logic.input(input); } private void update(float dt) { @@ -107,6 +111,7 @@ public class DefaultGameEngine implements GameEngine { this.screen = screenManager.createScreen(context.getProjectName(), WINDOW_WIDTH, WINDOW_HEIGHT); this.thread = threadManager.createThread(THREAD_NAME, this::run); + this.input = inputManager.getInput(); this.targetUps = TARGET_UPS; diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/logic/DefaultGameLogic.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/logic/DefaultGameLogic.java index d607e6b6..4ad86d5c 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/logic/DefaultGameLogic.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/logic/DefaultGameLogic.java @@ -2,8 +2,10 @@ package com.bartlomiejpluta.base.engine.logic; import com.bartlomiejpluta.base.api.game.camera.Camera; import com.bartlomiejpluta.base.api.game.context.Context; +import com.bartlomiejpluta.base.api.game.input.Input; import com.bartlomiejpluta.base.api.game.screen.Screen; import com.bartlomiejpluta.base.engine.core.gl.render.Renderer; +import com.bartlomiejpluta.base.engine.ui.manager.InputManager; import com.bartlomiejpluta.base.engine.world.camera.DefaultCamera; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -15,6 +17,7 @@ import org.springframework.stereotype.Component; @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class DefaultGameLogic implements GameLogic { private final Renderer renderer; + private final InputManager inputManager; private final Camera camera = new DefaultCamera(); private Context context; @@ -27,12 +30,12 @@ public class DefaultGameLogic implements GameLogic { renderer.init(); log.info("Initializing game context"); - context.init(screen, camera); + context.init(screen, inputManager.getInput(), camera); } @Override - public void input(Screen screen) { - context.input(screen); + public void input(Input input) { + context.input(input); } @Override diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/logic/GameLogic.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/logic/GameLogic.java index ac347fb9..6d3cd957 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/logic/GameLogic.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/logic/GameLogic.java @@ -1,13 +1,14 @@ package com.bartlomiejpluta.base.engine.logic; import com.bartlomiejpluta.base.api.game.context.Context; +import com.bartlomiejpluta.base.api.game.input.Input; import com.bartlomiejpluta.base.api.game.screen.Screen; import com.bartlomiejpluta.base.api.internal.gc.Cleanable; public interface GameLogic extends Cleanable { void init(Screen screen, Context context); - void input(Screen screen); + void input(Input input); void update(float dt); diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/ScreenManager.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/ScreenManager.java deleted file mode 100644 index b49bccfa..00000000 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/ScreenManager.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.bartlomiejpluta.base.engine.ui; - -import com.bartlomiejpluta.base.api.game.screen.Screen; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Slf4j -@Component -public class ScreenManager { - public Screen createScreen(String title, int width, int height) { - log.info("Creating GLFW window ([{}], {}x{})", title, width, height); - return GLFWScreen.create(title, width, height); - } -} diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/manager/InputManager.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/manager/InputManager.java new file mode 100644 index 00000000..68221f98 --- /dev/null +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/manager/InputManager.java @@ -0,0 +1,36 @@ +package com.bartlomiejpluta.base.engine.ui.manager; + +import com.bartlomiejpluta.base.api.game.input.Input; +import com.bartlomiejpluta.base.engine.error.AppException; +import com.bartlomiejpluta.base.engine.ui.model.GLFWInput; +import com.bartlomiejpluta.base.engine.ui.model.GLFWScreen; +import lombok.NonNull; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class InputManager { + private GLFWScreen screen; + private Input input; + + void registerScreen(@NonNull GLFWScreen screen) { + this.screen = screen; + } + + public Input getInput() { + if (input != null) { + return input; + } + + log.info("Creating input model singleton instance"); + + if (screen == null) { + throw new AppException("GLFWScreen is not registered yet"); + } + + input = new GLFWInput(screen); + + return input; + } +} diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/manager/ScreenManager.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/manager/ScreenManager.java new file mode 100644 index 00000000..1ec1d4b0 --- /dev/null +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/manager/ScreenManager.java @@ -0,0 +1,22 @@ +package com.bartlomiejpluta.base.engine.ui.manager; + +import com.bartlomiejpluta.base.api.game.screen.Screen; +import com.bartlomiejpluta.base.engine.ui.model.GLFWScreen; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class ScreenManager { + private final InputManager inputManager; + + public Screen createScreen(String title, int width, int height) { + log.info("Creating GLFW window ([{}], {}x{})", title, width, height); + var screen = GLFWScreen.create(title, width, height); + inputManager.registerScreen(screen); + return screen; + } +} diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/model/GLFWInput.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/model/GLFWInput.java new file mode 100644 index 00000000..3b6ff1f1 --- /dev/null +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/model/GLFWInput.java @@ -0,0 +1,15 @@ +package com.bartlomiejpluta.base.engine.ui.model; + +import com.bartlomiejpluta.base.api.game.input.Input; +import com.bartlomiejpluta.base.api.game.input.Key; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class GLFWInput implements Input { + private final GLFWScreen screen; + + @Override + public boolean isKeyPressed(Key key) { + return screen.isKeyPressed(key); + } +} diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/GLFWScreen.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/model/GLFWScreen.java similarity index 98% rename from engine/src/main/java/com/bartlomiejpluta/base/engine/ui/GLFWScreen.java rename to engine/src/main/java/com/bartlomiejpluta/base/engine/ui/model/GLFWScreen.java index 55d5400d..0b838917 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/GLFWScreen.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/ui/model/GLFWScreen.java @@ -1,4 +1,4 @@ -package com.bartlomiejpluta.base.engine.ui; +package com.bartlomiejpluta.base.engine.ui.model; import com.bartlomiejpluta.base.api.game.input.Key; import com.bartlomiejpluta.base.api.game.screen.Screen; @@ -115,7 +115,6 @@ public class GLFWScreen implements Screen { glfwPollEvents(); } - @Override public boolean isKeyPressed(Key key) { return glfwGetKey(windowHandle, glfwCode(key)) == GLFW_PRESS; } @@ -141,7 +140,7 @@ public class GLFWScreen implements Screen { return size; } - public static Screen create(String title, int width, int height) { + public static GLFWScreen create(String title, int width, int height) { return new GLFWScreen(title, width, height); }