diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/input/Key.java b/api/src/main/java/com/bartlomiejpluta/base/api/input/Key.java new file mode 100644 index 00000000..b6983ee1 --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/input/Key.java @@ -0,0 +1,125 @@ +package com.bartlomiejpluta.base.api.input; + +public enum Key { + KEY_SPACE, + KEY_APOSTROPHE, + KEY_COMMA, + KEY_MINUS, + KEY_PERIOD, + KEY_SLASH, + KEY_0, + KEY_1, + KEY_2, + KEY_3, + KEY_4, + KEY_5, + KEY_6, + KEY_7, + KEY_8, + KEY_9, + KEY_SEMICOLON, + KEY_EQUAL, + KEY_A, + KEY_B, + KEY_C, + KEY_D, + KEY_E, + KEY_F, + KEY_G, + KEY_H, + KEY_I, + KEY_J, + KEY_K, + KEY_L, + KEY_M, + KEY_N, + KEY_O, + KEY_P, + KEY_Q, + KEY_R, + KEY_S, + KEY_T, + KEY_U, + KEY_V, + KEY_W, + KEY_X, + KEY_Y, + KEY_Z, + KEY_LEFT_BRACKET, + KEY_BACKSLASH, + KEY_RIGHT_BRACKET, + KEY_GRAVE_ACCENT, + KEY_WORLD_1, + KEY_WORLD_2, + KEY_ESCAPE, + KEY_ENTER, + KEY_TAB, + KEY_BACKSPACE, + KEY_INSERT, + KEY_DELETE, + KEY_RIGHT, + KEY_LEFT, + KEY_DOWN, + KEY_UP, + KEY_PAGE_UP, + KEY_PAGE_DOWN, + KEY_HOME, + KEY_END, + KEY_CAPS_LOCK, + KEY_SCROLL_LOCK, + KEY_NUM_LOCK, + KEY_PRINT_SCREEN, + KEY_PAUSE, + KEY_F1, + KEY_F2, + KEY_F3, + KEY_F4, + KEY_F5, + KEY_F6, + KEY_F7, + KEY_F8, + KEY_F9, + KEY_F10, + KEY_F11, + KEY_F12, + KEY_F13, + KEY_F14, + KEY_F15, + KEY_F16, + KEY_F17, + KEY_F18, + KEY_F19, + KEY_F20, + KEY_F21, + KEY_F22, + KEY_F23, + KEY_F24, + KEY_F25, + KEY_KP_0, + KEY_KP_1, + KEY_KP_2, + KEY_KP_3, + KEY_KP_4, + KEY_KP_5, + KEY_KP_6, + KEY_KP_7, + KEY_KP_8, + KEY_KP_9, + KEY_KP_DECIMAL, + KEY_KP_DIVIDE, + KEY_KP_MULTIPLY, + KEY_KP_SUBTRACT, + KEY_KP_ADD, + KEY_KP_ENTER, + KEY_KP_EQUAL, + KEY_LEFT_SHIFT, + KEY_LEFT_CONTROL, + KEY_LEFT_ALT, + KEY_LEFT_SUPER, + KEY_RIGHT_SHIFT, + KEY_RIGHT_CONTROL, + KEY_RIGHT_ALT, + KEY_RIGHT_SUPER, + KEY_MENU, + KEY_LAST +} \ No newline at end of file diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/input/Keyboard.java b/api/src/main/java/com/bartlomiejpluta/base/api/input/Keyboard.java new file mode 100644 index 00000000..0452b11b --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/input/Keyboard.java @@ -0,0 +1,5 @@ +package com.bartlomiejpluta.base.api.input; + +public interface Keyboard { + boolean isKeyPressed(Key key); +} diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/map/MapHandler.java b/api/src/main/java/com/bartlomiejpluta/base/api/map/MapHandler.java index f81c90c4..6536d9a2 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/map/MapHandler.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/map/MapHandler.java @@ -1,7 +1,10 @@ package com.bartlomiejpluta.base.api.map; import com.bartlomiejpluta.base.api.context.Context; +import com.bartlomiejpluta.base.api.input.Keyboard; public interface MapHandler { void init(Context context); + + void input(Keyboard keyboard); } diff --git a/game/src/main/java/com/bartlomiejpluta/base/game/input/GLFWKeyboard.java b/game/src/main/java/com/bartlomiejpluta/base/game/input/GLFWKeyboard.java new file mode 100644 index 00000000..09e47a57 --- /dev/null +++ b/game/src/main/java/com/bartlomiejpluta/base/game/input/GLFWKeyboard.java @@ -0,0 +1,144 @@ +package com.bartlomiejpluta.base.game.input; + +import com.bartlomiejpluta.base.api.input.Key; +import com.bartlomiejpluta.base.api.input.Keyboard; +import com.bartlomiejpluta.base.core.ui.Window; +import lombok.RequiredArgsConstructor; + +import static org.lwjgl.glfw.GLFW.*; + +@RequiredArgsConstructor +public class GLFWKeyboard implements Keyboard { + private final Window window; + + @Override + public boolean isKeyPressed(Key key) { + return window.isKeyPressed(glfwCode(key)); + } + + private static int glfwCode(Key key) { + return switch (key) { + case KEY_SPACE -> GLFW_KEY_SPACE; + case KEY_APOSTROPHE -> GLFW_KEY_APOSTROPHE; + case KEY_COMMA -> GLFW_KEY_COMMA; + case KEY_MINUS -> GLFW_KEY_MINUS; + case KEY_PERIOD -> GLFW_KEY_PERIOD; + case KEY_SLASH -> GLFW_KEY_SLASH; + case KEY_0 -> GLFW_KEY_0; + case KEY_1 -> GLFW_KEY_1; + case KEY_2 -> GLFW_KEY_2; + case KEY_3 -> GLFW_KEY_3; + case KEY_4 -> GLFW_KEY_4; + case KEY_5 -> GLFW_KEY_5; + case KEY_6 -> GLFW_KEY_6; + case KEY_7 -> GLFW_KEY_7; + case KEY_8 -> GLFW_KEY_8; + case KEY_9 -> GLFW_KEY_9; + case KEY_SEMICOLON -> GLFW_KEY_SEMICOLON; + case KEY_EQUAL -> GLFW_KEY_EQUAL; + case KEY_A -> GLFW_KEY_A; + case KEY_B -> GLFW_KEY_B; + case KEY_C -> GLFW_KEY_C; + case KEY_D -> GLFW_KEY_D; + case KEY_E -> GLFW_KEY_E; + case KEY_F -> GLFW_KEY_F; + case KEY_G -> GLFW_KEY_G; + case KEY_H -> GLFW_KEY_H; + case KEY_I -> GLFW_KEY_I; + case KEY_J -> GLFW_KEY_J; + case KEY_K -> GLFW_KEY_K; + case KEY_L -> GLFW_KEY_L; + case KEY_M -> GLFW_KEY_M; + case KEY_N -> GLFW_KEY_N; + case KEY_O -> GLFW_KEY_O; + case KEY_P -> GLFW_KEY_P; + case KEY_Q -> GLFW_KEY_Q; + case KEY_R -> GLFW_KEY_R; + case KEY_S -> GLFW_KEY_S; + case KEY_T -> GLFW_KEY_T; + case KEY_U -> GLFW_KEY_U; + case KEY_V -> GLFW_KEY_V; + case KEY_W -> GLFW_KEY_W; + case KEY_X -> GLFW_KEY_X; + case KEY_Y -> GLFW_KEY_Y; + case KEY_Z -> GLFW_KEY_Z; + case KEY_LEFT_BRACKET -> GLFW_KEY_LEFT_BRACKET; + case KEY_BACKSLASH -> GLFW_KEY_BACKSLASH; + case KEY_RIGHT_BRACKET -> GLFW_KEY_RIGHT_BRACKET; + case KEY_GRAVE_ACCENT -> GLFW_KEY_GRAVE_ACCENT; + case KEY_WORLD_1 -> GLFW_KEY_WORLD_1; + case KEY_WORLD_2 -> GLFW_KEY_WORLD_2; + case KEY_ESCAPE -> GLFW_KEY_ESCAPE; + case KEY_ENTER -> GLFW_KEY_ENTER; + case KEY_TAB -> GLFW_KEY_TAB; + case KEY_BACKSPACE -> GLFW_KEY_BACKSPACE; + case KEY_INSERT -> GLFW_KEY_INSERT; + case KEY_DELETE -> GLFW_KEY_DELETE; + case KEY_RIGHT -> GLFW_KEY_RIGHT; + case KEY_LEFT -> GLFW_KEY_LEFT; + case KEY_DOWN -> GLFW_KEY_DOWN; + case KEY_UP -> GLFW_KEY_UP; + case KEY_PAGE_UP -> GLFW_KEY_PAGE_UP; + case KEY_PAGE_DOWN -> GLFW_KEY_PAGE_DOWN; + case KEY_HOME -> GLFW_KEY_HOME; + case KEY_END -> GLFW_KEY_END; + case KEY_CAPS_LOCK -> GLFW_KEY_CAPS_LOCK; + case KEY_SCROLL_LOCK -> GLFW_KEY_SCROLL_LOCK; + case KEY_NUM_LOCK -> GLFW_KEY_NUM_LOCK; + case KEY_PRINT_SCREEN -> GLFW_KEY_PRINT_SCREEN; + case KEY_PAUSE -> GLFW_KEY_PAUSE; + case KEY_F1 -> GLFW_KEY_F1; + case KEY_F2 -> GLFW_KEY_F2; + case KEY_F3 -> GLFW_KEY_F3; + case KEY_F4 -> GLFW_KEY_F4; + case KEY_F5 -> GLFW_KEY_F5; + case KEY_F6 -> GLFW_KEY_F6; + case KEY_F7 -> GLFW_KEY_F7; + case KEY_F8 -> GLFW_KEY_F8; + case KEY_F9 -> GLFW_KEY_F9; + case KEY_F10 -> GLFW_KEY_F10; + case KEY_F11 -> GLFW_KEY_F11; + case KEY_F12 -> GLFW_KEY_F12; + case KEY_F13 -> GLFW_KEY_F13; + case KEY_F14 -> GLFW_KEY_F14; + case KEY_F15 -> GLFW_KEY_F15; + case KEY_F16 -> GLFW_KEY_F16; + case KEY_F17 -> GLFW_KEY_F17; + case KEY_F18 -> GLFW_KEY_F18; + case KEY_F19 -> GLFW_KEY_F19; + case KEY_F20 -> GLFW_KEY_F20; + case KEY_F21 -> GLFW_KEY_F21; + case KEY_F22 -> GLFW_KEY_F22; + case KEY_F23 -> GLFW_KEY_F23; + case KEY_F24 -> GLFW_KEY_F24; + case KEY_F25 -> GLFW_KEY_F25; + case KEY_KP_0 -> GLFW_KEY_KP_0; + case KEY_KP_1 -> GLFW_KEY_KP_1; + case KEY_KP_2 -> GLFW_KEY_KP_2; + case KEY_KP_3 -> GLFW_KEY_KP_3; + case KEY_KP_4 -> GLFW_KEY_KP_4; + case KEY_KP_5 -> GLFW_KEY_KP_5; + case KEY_KP_6 -> GLFW_KEY_KP_6; + case KEY_KP_7 -> GLFW_KEY_KP_7; + case KEY_KP_8 -> GLFW_KEY_KP_8; + case KEY_KP_9 -> GLFW_KEY_KP_9; + case KEY_KP_DECIMAL -> GLFW_KEY_KP_DECIMAL; + case KEY_KP_DIVIDE -> GLFW_KEY_KP_DIVIDE; + case KEY_KP_MULTIPLY -> GLFW_KEY_KP_MULTIPLY; + case KEY_KP_SUBTRACT -> GLFW_KEY_KP_SUBTRACT; + case KEY_KP_ADD -> GLFW_KEY_KP_ADD; + case KEY_KP_ENTER -> GLFW_KEY_KP_ENTER; + case KEY_KP_EQUAL -> GLFW_KEY_KP_EQUAL; + case KEY_LEFT_SHIFT -> GLFW_KEY_LEFT_SHIFT; + case KEY_LEFT_CONTROL -> GLFW_KEY_LEFT_CONTROL; + case KEY_LEFT_ALT -> GLFW_KEY_LEFT_ALT; + case KEY_LEFT_SUPER -> GLFW_KEY_LEFT_SUPER; + case KEY_RIGHT_SHIFT -> GLFW_KEY_RIGHT_SHIFT; + case KEY_RIGHT_CONTROL -> GLFW_KEY_RIGHT_CONTROL; + case KEY_RIGHT_ALT -> GLFW_KEY_RIGHT_ALT; + case KEY_RIGHT_SUPER -> GLFW_KEY_RIGHT_SUPER; + case KEY_MENU -> GLFW_KEY_MENU; + case KEY_LAST -> GLFW_KEY_LAST; + }; + } +} diff --git a/game/src/main/java/com/bartlomiejpluta/base/game/logic/DefaultGameLogic.java b/game/src/main/java/com/bartlomiejpluta/base/game/logic/DefaultGameLogic.java index 901e8ed0..90635ba6 100644 --- a/game/src/main/java/com/bartlomiejpluta/base/game/logic/DefaultGameLogic.java +++ b/game/src/main/java/com/bartlomiejpluta/base/game/logic/DefaultGameLogic.java @@ -51,6 +51,7 @@ public class DefaultGameLogic implements GameLogic { public void init(Window window) { log.info("Initializing game logic"); renderer.init(); + context.init(window); project = projectLoader.loadProject(); var runnerClass = classLoader.loadClass(project.getRunner()); @@ -61,7 +62,7 @@ public class DefaultGameLogic implements GameLogic { @Override public void input(Window window) { - + context.input(); } @Override diff --git a/game/src/main/java/com/bartlomiejpluta/base/game/project/model/RenderableContext.java b/game/src/main/java/com/bartlomiejpluta/base/game/project/model/RenderableContext.java index 9e4a366d..fe009c0a 100644 --- a/game/src/main/java/com/bartlomiejpluta/base/game/project/model/RenderableContext.java +++ b/game/src/main/java/com/bartlomiejpluta/base/game/project/model/RenderableContext.java @@ -1,6 +1,7 @@ package com.bartlomiejpluta.base.game.project.model; import com.bartlomiejpluta.base.api.context.Context; +import com.bartlomiejpluta.base.api.input.Keyboard; import com.bartlomiejpluta.base.api.map.MapHandler; import com.bartlomiejpluta.base.core.gl.object.texture.TextureManager; import com.bartlomiejpluta.base.core.gl.render.Renderable; @@ -10,6 +11,7 @@ import com.bartlomiejpluta.base.core.ui.Window; import com.bartlomiejpluta.base.core.util.mesh.MeshManager; import com.bartlomiejpluta.base.core.world.camera.Camera; import com.bartlomiejpluta.base.game.image.manager.ImageManager; +import com.bartlomiejpluta.base.game.input.GLFWKeyboard; import com.bartlomiejpluta.base.game.map.manager.MapManager; import com.bartlomiejpluta.base.game.map.model.GameMap; import com.bartlomiejpluta.base.game.project.loader.ClassLoader; @@ -31,7 +33,13 @@ public class RenderableContext implements Context, Updatable, Renderable { private final MapManager mapManager; private final ClassLoader classLoader; + private Keyboard keyboard; private GameMap map; + private MapHandler mapHandler; + + public void init(Window window) { + keyboard = new GLFWKeyboard(window); + } @SneakyThrows @Override @@ -39,9 +47,13 @@ public class RenderableContext implements Context, Updatable, Renderable { map = mapManager.loadMap(mapUid); var handlerClass = classLoader.loadClass(map.getHandler()); - var handler = handlerClass.getConstructor().newInstance(); + mapHandler = handlerClass.getConstructor().newInstance(); - handler.init(this); + mapHandler.init(this); + } + + public void input() { + mapHandler.input(keyboard); } @Override