diff --git a/GameEngine/src/main/java/org/example/ColorController.java b/GameEngine/src/main/java/org/example/ColorController.java index 7949bda..52cd4cb 100644 --- a/GameEngine/src/main/java/org/example/ColorController.java +++ b/GameEngine/src/main/java/org/example/ColorController.java @@ -1,47 +1,78 @@ package org.example; -import static org.lwjgl.glfw.GLFW.*; -import static org.lwjgl.opengl.GL11.glClearColor; +import org.lwjgl.opengl.GL11; public class ColorController implements IGameComponent { + private float red; + private float green; + private float blue; + private int customKeyInput; + private static int customKeyCode; + private int customColor; - private float red, green, blue; - - @Override - public void init() { - setColor(0.0f,0.0f,0.0f); + public ColorController() { } - @Override - public void update() { + public void init() { + this.setColor(0.0F, 0.0F, 0.0F); + } - if (KeyInput.KeyDown(GLFW_KEY_R)) { - setColor(1.0f, 0.0f, 0.0f); // Rキーが押された瞬間 + public void update() { + if (KeyInput.KeyDown(82)) { + this.setColor(1.0F, 0.0F, 0.0F); System.out.println("R"); } - if (KeyInput.KeyPress(GLFW_KEY_G)) { - setColor(0.0f, 1.0f, 0.0f); // Gキーが押され続けている間 + + if (KeyInput.KeyPress(71)) { + this.setColor(0.0F, 1.0F, 0.0F); System.out.println("G"); } - if (KeyInput.KeyUp(GLFW_KEY_B)) { - setColor(0.0f, 0.0f, 1.0f); // Bキーが離された瞬間 + + if (KeyInput.KeyUp(66)) { + this.setColor(0.0F, 0.0F, 1.0F); System.out.println("B"); } - if (KeyInput.KeyUp(GLFW_KEY_Y)) { - setColor(1.0f, 1.0f, 0.0f); + + if (KeyInput.KeyUp(89)) { + this.setColor(1.0F, 1.0F, 0.0F); System.out.println("Y"); } - glClearColor(getRed(), getGreen(), getBlue(), 0.0f); + if (KeyInput.KeyPress(customKeyCode)) { + this.setColor(0.0F, 1.0F, 1.0F); + System.out.println("Custom"); + } + + GL11.glClearColor(this.getRed(), this.getGreen(), this.getBlue(), 0.0F); } - public float getRed() { return red; } - public float getGreen() { return green; } - public float getBlue() { return blue; } - - public void setColor(float r, float g, float b){ - red = r; - green = g; - blue = b; + public float getRed() { + return this.red; } -} \ No newline at end of file + + public float getGreen() { + return this.green; + } + + public float getBlue() { + return this.blue; + } + + public void setColor(float r, float g, float b) { + this.red = r; + this.green = g; + this.blue = b; + } + + public void setCustomKeyInput(int value) { + this.customKeyInput = value; + } + + public static void setCustomKeyCode(int value) { + customKeyCode = value; + } + + public void setCustomColor(int value) { + this.customColor = value; + } +} diff --git a/GameEngine/src/main/java/org/example/KeyInput.java b/GameEngine/src/main/java/org/example/KeyInput.java index c9c198b..f90e565 100644 --- a/GameEngine/src/main/java/org/example/KeyInput.java +++ b/GameEngine/src/main/java/org/example/KeyInput.java @@ -1,13 +1,12 @@ package org.example; -import static org.lwjgl.glfw.GLFW.*; +import org.lwjgl.glfw.GLFW; public class KeyInput { private static KeyInput instance; private static long window; - - private static final boolean[] lastKeyStates = new boolean[GLFW_KEY_LAST + 1]; // 前フレームのキー状態 - private static final boolean[] currentKeyStates = new boolean[GLFW_KEY_LAST + 1]; // 現在のキー状態 + private static final boolean[] lastKeyStates = new boolean[349]; + private static final boolean[] currentKeyStates = new boolean[349]; private KeyInput(long window) { KeyInput.window = window; @@ -17,44 +16,39 @@ if (instance == null) { instance = new KeyInput(window); } + } - // キーを押している時 public static boolean KeyPress(int keyCode) { - if (isValidKeyCode(keyCode)) { - return currentKeyStates[keyCode]; - } - return false; + return isValidKeyCode(keyCode) ? currentKeyStates[keyCode] : false; } - //キーを押した時 public static boolean KeyDown(int keyCode) { - if (isValidKeyCode(keyCode)) { + if (!isValidKeyCode(keyCode)) { + return false; + } else { return currentKeyStates[keyCode] && !lastKeyStates[keyCode]; } - return false; } - //キーを離した時 public static boolean KeyUp(int keyCode) { - if (isValidKeyCode(keyCode)) { - return !currentKeyStates[keyCode] && lastKeyStates[keyCode]; // 今押されておらず、前は押されていた + if (!isValidKeyCode(keyCode)) { + return false; + } else { + return !currentKeyStates[keyCode] && lastKeyStates[keyCode]; } - return false; } - // キー状態を更新 public static void updateKeyStates() { - // 前回のキー状態を保存 System.arraycopy(currentKeyStates, 0, lastKeyStates, 0, currentKeyStates.length); - for (int i = GLFW_KEY_SPACE; i <= GLFW_KEY_LAST; i++) { // 有効な範囲でのみ更新 - currentKeyStates[i] = glfwGetKey(window, i) == GLFW_PRESS; + for(int i = 32; i <= 348; ++i) { + currentKeyStates[i] = GLFW.glfwGetKey(window, i) == 1; } + } - // 有効なキーコードかチェック private static boolean isValidKeyCode(int keyCode) { - return keyCode >= GLFW_KEY_SPACE && keyCode <= GLFW_KEY_LAST; + return keyCode >= 32 && keyCode <= 348; } } diff --git a/GameEngine/src/main/java/org/example/Main.java b/GameEngine/src/main/java/org/example/Main.java index 7bef3d7..f106395 100644 --- a/GameEngine/src/main/java/org/example/Main.java +++ b/GameEngine/src/main/java/org/example/Main.java @@ -1,116 +1,12 @@ package org.example; -import org.lwjgl.*; -import org.lwjgl.glfw.*; -import org.lwjgl.opengl.*; -import org.lwjgl.system.*; - -import java.nio.*; -import java.util.ArrayList; -import java.util.List; - -import static org.lwjgl.glfw.Callbacks.*; -import static org.lwjgl.glfw.GLFW.*; -import static org.lwjgl.opengl.GL11.*; -import static org.lwjgl.system.MemoryStack.*; -import static org.lwjgl.system.MemoryUtil.*; - public class Main { + public Main() { + } - private long window; - private final List iGameComponents = new ArrayList<>(); public static void main(String[] args) { - new Main().run(); + Window window = Window.get(); + Swing.swing(); + window.run(); } - - public void run() { - System.out.println("Hello LWJGL " + Version.getVersion() + "!"); - init(); - loop(); - - glfwFreeCallbacks(window);// ウィンドウのコールバックを解放し、ウィンドウを破棄 - glfwDestroyWindow(window); - glfwTerminate(); // GLFWを終了し、エラーコールバックを解放 - glfwSetErrorCallback(null).free(); - } - - private void init() { - // エラーコールバックをセットアップします。デフォルトの実装はエラーメッセージをSystem.errに出力します。 - GLFWErrorCallback.createPrint(System.err).set(); - - // GLFWを初期化します。これを行う前にほとんどのGLFW関数は動作しません。 - if ( !glfwInit() ) - throw new IllegalStateException("GLFWの初期化に失敗しました"); - - // GLFWの設定 - glfwDefaultWindowHints(); // オプション、現在のウィンドウヒントはすでにデフォルト - glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); // ウィンドウ非表示 - glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE); // ウィンドウサイズ変更を行わない - - // ウィンドウの作成 - window = glfwCreateWindow(800, 600, "Hello World!", NULL, NULL); - if ( window == NULL ) - throw new RuntimeException("GLFWウィンドウの作成に失敗しました"); - - // キーのコールバックを設定します。キーが押された、繰り返された、または放されたときに呼び出されます。 - glfwSetKeyCallback(window, (window, key, scancode, action, mods) -> { - if ( key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE ) - glfwSetWindowShouldClose(window, true); // レンダリングループでこれを検出します - }); - - // スレッドスタックを取得し、新しいフレームをプッシュします - try ( MemoryStack stack = stackPush() ) { - IntBuffer pWidth = stack.mallocInt(1); // int* - IntBuffer pHeight = stack.mallocInt(1); // int* - - // glfwCreateWindowに渡されたウィンドウサイズを取得 - glfwGetWindowSize(window, pWidth, pHeight); - - // プライマリモニターの解像度を取得 - GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor()); - - // ウィンドウを中央に配置 - glfwSetWindowPos( - window, - (vidmode.width() - pWidth.get(0)) / 2, - (vidmode.height() - pHeight.get(0)) / 2 - ); - } // スタックフレームは自動的にポップされます - - glfwMakeContextCurrent(window); // OpenGLコンテキストを現在のスレッドに設定 - glfwSwapInterval(1); // 垂直同期を有効化 - glfwShowWindow(window); // ウィンドウを表示 - - //--------------------------------------------------------------- - KeyInput.init(window); - iGameComponents.add(new ColorController()); - - //GameComponentのinit処理 - for (IGameComponent gameComponents : iGameComponents) { - gameComponents.init(); - } - //--------------------------------------------------------------- - } - - private void loop() { - GL.createCapabilities(); - - while (!glfwWindowShouldClose(window)) { - //--------------------------------------------------------------- - // 毎フレームのキー状態を更新 - KeyInput.updateKeyStates(); - - //GameComponentのupdate処理 - for (IGameComponent gameComponents : iGameComponents) { - gameComponents.update(); - } - //--------------------------------------------------------------- - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // フレームバッファをクリア - glfwSwapBuffers(window); // カラーバッファを交換 - glfwPollEvents(); // ウィンドウイベントをポーリング - } - - } - } \ No newline at end of file diff --git a/GameEngine/src/main/java/org/example/Swing.java b/GameEngine/src/main/java/org/example/Swing.java new file mode 100644 index 0000000..bb7499e --- /dev/null +++ b/GameEngine/src/main/java/org/example/Swing.java @@ -0,0 +1,64 @@ + +package org.example; + +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Objects; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; + +public class Swing { + public Swing() { + } + + public static void swing() { + JFrame frame = new JFrame("Swing Example"); + frame.setDefaultCloseOperation(3); + frame.setSize(300, 200); + JPanel panel = new JPanel(); + panel.setLayout(new GridLayout(4, 2)); + JLabel keyInputLabel = new JLabel("KeyInput:"); + String[] keyInputOptions = new String[]{"KeyPress", "KeyDown", "KeyUp"}; + final JComboBox keyInputDropdown = new JComboBox(keyInputOptions); + JLabel keyCodeLabel = new JLabel("KeyCode:"); + String[] keyCodeOptions = new String[]{"A", "S", "D"}; + final JComboBox keyCodeDropdown = new JComboBox(keyCodeOptions); + JLabel colorLabel = new JLabel("Color:"); + String[] colorOptions = new String[]{"Red", "Blue", "Green", "Yellow"}; + final JComboBox colorDropdown = new JComboBox(colorOptions); + JButton updateButton = new JButton("Update"); + updateButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String selectedKeyInput = (String)keyInputDropdown.getSelectedItem(); + String selectedKeyCode = (String)keyCodeDropdown.getSelectedItem(); + String selectedColor = (String)colorDropdown.getSelectedItem(); + if (Objects.equals(selectedKeyCode, "A")) { + ColorController.setCustomKeyCode(65); + } + + if (Objects.equals(selectedKeyCode, "S")) { + ColorController.setCustomKeyCode(83); + } + + if (Objects.equals(selectedKeyCode, "D")) { + ColorController.setCustomKeyCode(68); + } + + } + }); + panel.add(keyInputLabel); + panel.add(keyInputDropdown); + panel.add(keyCodeLabel); + panel.add(keyCodeDropdown); + panel.add(colorLabel); + panel.add(colorDropdown); + panel.add(new JLabel()); + panel.add(updateButton); + frame.add(panel); + frame.setVisible(true); + } +} \ No newline at end of file diff --git a/GameEngine/src/main/java/org/example/Window.java b/GameEngine/src/main/java/org/example/Window.java new file mode 100644 index 0000000..bca8b40 --- /dev/null +++ b/GameEngine/src/main/java/org/example/Window.java @@ -0,0 +1,124 @@ + +package org.example; + +import java.nio.IntBuffer; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import org.lwjgl.Version; +import org.lwjgl.glfw.Callbacks; +import org.lwjgl.glfw.GLFW; +import org.lwjgl.glfw.GLFWErrorCallback; +import org.lwjgl.glfw.GLFWErrorCallbackI; +import org.lwjgl.glfw.GLFWVidMode; +import org.lwjgl.opengl.GL; +import org.lwjgl.opengl.GL11; +import org.lwjgl.system.MemoryStack; + +public class Window { + private static Window window; + private int width = 800; + private int height = 600; + String title = "HelloWorld"; + private long glfwWindow; + private final List iGameComponents = new ArrayList(); + + private Window() { + } + + public static Window get() { + if (window == null) { + window = new Window(); + } + + return window; + } + + public void run() { + System.out.println("Hello LWJGL " + Version.getVersion() + "!"); + this.init(); + this.loop(); + Callbacks.glfwFreeCallbacks(this.glfwWindow); + GLFW.glfwDestroyWindow(this.glfwWindow); + GLFW.glfwTerminate(); + GLFW.glfwSetErrorCallback((GLFWErrorCallbackI)null).free(); + } + + private void init() { + GLFWErrorCallback.createPrint(System.err).set(); + if (!GLFW.glfwInit()) { + throw new IllegalStateException("GLFWの初期化に失敗しました"); + } else { + GLFW.glfwDefaultWindowHints(); + GLFW.glfwWindowHint(131076, 0); + GLFW.glfwWindowHint(131075, 0); + GLFW.glfwWindowHint(131080, 0); + this.glfwWindow = GLFW.glfwCreateWindow(this.width, this.height, this.title, 0L, 0L); + if (this.glfwWindow == 0L) { + throw new RuntimeException("GLFWウィンドウの作成に失敗しました"); + } else { + GLFW.glfwSetKeyCallback(this.glfwWindow, (window, key, scancode, action, mods) -> { + if (key == 256 && action == 0) { + GLFW.glfwSetWindowShouldClose(window, true); + } + + }); + MemoryStack stack = MemoryStack.stackPush(); + + try { + IntBuffer pWidth = stack.mallocInt(1); + IntBuffer pHeight = stack.mallocInt(1); + GLFW.glfwGetWindowSize(this.glfwWindow, pWidth, pHeight); + GLFWVidMode vidmode = GLFW.glfwGetVideoMode(GLFW.glfwGetPrimaryMonitor()); + GLFW.glfwSetWindowPos(this.glfwWindow, (vidmode.width() - pWidth.get(0)) / 2, (vidmode.height() - pHeight.get(0)) / 2); + } catch (Throwable var6) { + if (stack != null) { + try { + stack.close(); + } catch (Throwable var5) { + var6.addSuppressed(var5); + } + } + + throw var6; + } + + if (stack != null) { + stack.close(); + } + + GLFW.glfwMakeContextCurrent(this.glfwWindow); + GLFW.glfwSwapInterval(1); + GLFW.glfwShowWindow(this.glfwWindow); + KeyInput.init(this.glfwWindow); + this.iGameComponents.add(new ColorController()); + Iterator var7 = this.iGameComponents.iterator(); + + while(var7.hasNext()) { + IGameComponent gameComponents = (IGameComponent)var7.next(); + gameComponents.init(); + } + + } + } + } + + private void loop() { + GL.createCapabilities(); + + while(!GLFW.glfwWindowShouldClose(this.glfwWindow)) { + KeyInput.updateKeyStates(); + Iterator var1 = this.iGameComponents.iterator(); + + while(var1.hasNext()) { + IGameComponent gameComponents = (IGameComponent)var1.next(); + gameComponents.update(); + } + + GL11.glClear(16640); + GLFW.glfwSwapBuffers(this.glfwWindow); + GLFW.glfwPollEvents(); + } + + } +} \ No newline at end of file