diff --git a/GameEngine/src/main/java/Main.java b/GameEngine/src/main/java/Main.java index 055d229..9fa6e95 100644 --- a/GameEngine/src/main/java/Main.java +++ b/GameEngine/src/main/java/Main.java @@ -4,7 +4,6 @@ public class Main { public static void main(String[] args) { Window window = Window.get(); - window.run(); - + window.runWithEditor(); } } \ No newline at end of file diff --git a/GameEngine/src/main/java/gameEngine/GameEditor.java b/GameEngine/src/main/java/gameEngine/GameEditor.java index 8de7a0e..b19bdd1 100644 --- a/GameEngine/src/main/java/gameEngine/GameEditor.java +++ b/GameEngine/src/main/java/gameEngine/GameEditor.java @@ -5,6 +5,7 @@ import gameEngine.entites.gameComponents.GameComponent; import gameEngine.entites.gameComponents.*; import gameEngine.scenes.*; +import gameEngine.views.Window; import org.joml.Vector3f; import javax.swing.*; @@ -32,15 +33,15 @@ private String lastLoadedName; private Vector3f lastLoadedPos, lastLoadedRot, lastLoadedScale; - - public GameEditor() { + public GameEditor() + { setTitle("Game Object Editor"); setSize(500, 400); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // 閉じられないようにする setLayout(null); // レイアウトを絶対座標に設定 initializeUIComponents();// 各UI要素の初期化 initializeUpdateTimer(); // 定期的にリスト更新を行うタイマーを初期化 - setVisible(true); // フレームを表示 + setVisible(true); // フレームを表示} } // UI要素を初期化し、配置関数を呼び出す @@ -71,7 +72,7 @@ scaleXField = new JTextField(5); scaleYField = new JTextField(5); scaleZField = new JTextField(5); - componentDropdown = new JComboBox<>(new String[]{"ColorController", "CopyEntity", "MoveImage"}); + componentDropdown = new JComboBox<>(new String[]{"ColorController", "CopyEntity", "MoveImage", "Physics"}); addChangeListener(posXField, posYField, posZField, rotXField, rotYField, rotZField, scaleXField, scaleYField, scaleZField, nameField); @@ -211,6 +212,9 @@ case "MoveImage": gameScene.addComponentToGameObject(gameObject, new MoveImage(gameObject)); break; + case "Physics": + gameScene.addComponentToGameObject(gameObject, new Physics(gameObject)); + break; default: JOptionPane.showMessageDialog(this, "Unknown Component Selected"); break; diff --git a/GameEngine/src/main/java/gameEngine/Time.java b/GameEngine/src/main/java/gameEngine/Time.java index 46027b5..d7b29f2 100644 --- a/GameEngine/src/main/java/gameEngine/Time.java +++ b/GameEngine/src/main/java/gameEngine/Time.java @@ -1,7 +1,21 @@ package gameEngine; public class Time { - public static float timeStarted = System.nanoTime(); + public static long timeStarted = System.nanoTime(); + private static long lastFrameTime = System.nanoTime(); + public static float deltaTime = 0; public static float getTime(){return (float)((System.nanoTime() - timeStarted) * 1E-9); } + + public static void update() { + long currentTime = System.nanoTime(); + deltaTime = (float)((currentTime - lastFrameTime) * 1E-9); + lastFrameTime = currentTime; + } + + public static void reset() { + timeStarted = System.nanoTime(); + lastFrameTime = timeStarted; + deltaTime = 0; + } } diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/ColorController.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/ColorController.java index 73d9ad0..7bba6c8 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/ColorController.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/ColorController.java @@ -1,4 +1,6 @@ package gameEngine.entites.gameComponents; +import gameEngine.entites.Entity; +import gameEngine.entites.GameObject; import gameEngine.input.*; import gameEngine.views.Color; @@ -8,6 +10,15 @@ public class ColorController extends GameComponent { private Color color = new Color(0,0,0); + public ColorController() { + } + + @Override + public GameComponent copy() { + return this; + } + + public void init() { color = Color.BLACK; } diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/CopyEntity.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/CopyEntity.java index 086c9fc..bb9d02e 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/CopyEntity.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/CopyEntity.java @@ -8,11 +8,17 @@ import static org.lwjgl.glfw.GLFW.GLFW_KEY_G; public class CopyEntity extends GameComponent{ + Window window = Window.get(); private Entity entity; public CopyEntity(Entity entity){ this.entity = entity; } + @Override + public GameComponent copy() { + return this; + } + public void update() { if(Input.GetKeyDown(GLFW_KEY_G)){ diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/GameComponent.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/GameComponent.java index d164392..792f83e 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/GameComponent.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/GameComponent.java @@ -1,6 +1,7 @@ package gameEngine.entites.gameComponents; public abstract class GameComponent { + public abstract GameComponent copy(); protected boolean isGameSceneComponent; public boolean isGameSceneComponent() { @@ -18,4 +19,5 @@ public void update() { } + } diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java index 4864af4..dd2d5f8 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java @@ -26,14 +26,14 @@ this.texture = new Texture(texturePath); // Load the image } } - public Mesh(Mesh original, Entity newParent) { this.type = original.type; this.texture = original.texture; // Textureをそのまま参照 this.parent = newParent; // 新しい親オブジェクトに設定 } - public Mesh copy(){ + @Override + public GameComponent copy() { return this; } diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/MoveImage.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/MoveImage.java index 56db123..ba50d62 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/MoveImage.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/MoveImage.java @@ -9,11 +9,16 @@ public class MoveImage extends GameComponent{ + private Entity entity; public MoveImage(Entity entity){ this.entity = entity; } + @Override + public GameComponent copy() { + return this; + } public void update() { if (Input.GetKey(GLFW_KEY_W)) { diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Physics.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/Physics.java new file mode 100644 index 0000000..67f0a8f --- /dev/null +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/Physics.java @@ -0,0 +1,36 @@ +package gameEngine.entites.gameComponents; + +import gameEngine.Time; +import gameEngine.entites.Entity; + +public class Physics extends GameComponent{ + + private Entity entity; + public boolean useGravity = true; + private float gravity = 9.8f; // 地球の重力加速度を使用 + private float velocityY = 0; // Y軸方向の速度 + + public Physics(Entity entity){ + this.entity = entity; + } + + @Override + public GameComponent copy() { + return this; + } + + public void update() { + if (useGravity) { + float deltaTime = Time.deltaTime; + + velocityY += gravity * deltaTime; + + float y = entity.transform.position.y; + entity.transform.setPosition(entity.transform.position.x, y + velocityY * deltaTime, entity.transform.position.z); + } + } + + public void reset() { + velocityY = 0; + } +} diff --git a/GameEngine/src/main/java/gameEngine/scenes/Scene.java b/GameEngine/src/main/java/gameEngine/scenes/Scene.java index 54bd7a0..215f8e0 100644 --- a/GameEngine/src/main/java/gameEngine/scenes/Scene.java +++ b/GameEngine/src/main/java/gameEngine/scenes/Scene.java @@ -3,14 +3,15 @@ import gameEngine.entites.Camera; import gameEngine.entites.Entity; import gameEngine.entites.GameObject; -import gameEngine.entites.gameComponents.GameComponent; -import gameEngine.entites.gameComponents.Mesh; +import gameEngine.entites.gameComponents.*; import gameEngine.geometry.Transform; import gameEngine.input.Input; import gameEngine.views.Color; import gameEngine.views.Window; import java.awt.event.KeyEvent; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.LinkedList; import java.util.Queue; @@ -71,12 +72,12 @@ } // タスクを登録 - private void enqueueTask(Runnable task) { + private synchronized void enqueueTask(Runnable task) { taskQueue.add(task); } // タスクの実行 - public void processTasks() { + public synchronized void processTasks() { while (!taskQueue.isEmpty()) { taskQueue.poll().run(); } @@ -94,8 +95,19 @@ for (GameComponent gameComponent : original.gameComponents) { if (gameComponent instanceof Mesh) { - newGameObject.addComponent(new Mesh(((Mesh) gameComponent).copy(), newGameObject)); - break; + newGameObject.addComponent(new Mesh((Mesh)gameComponent.copy(), newGameObject)); + } + if (gameComponent instanceof ColorController) { + newGameObject.addComponent(new ColorController()); + } + if (gameComponent instanceof CopyEntity) { + newGameObject.addComponent(new CopyEntity(newGameObject)); + } + if (gameComponent instanceof MoveImage) { + newGameObject.addComponent(new MoveImage(newGameObject)); + } + if (gameComponent instanceof Physics) { + newGameObject.addComponent(new Physics(newGameObject)); } } diff --git a/GameEngine/src/main/java/gameEngine/views/Window.java b/GameEngine/src/main/java/gameEngine/views/Window.java index 32ee4d8..d442522 100644 --- a/GameEngine/src/main/java/gameEngine/views/Window.java +++ b/GameEngine/src/main/java/gameEngine/views/Window.java @@ -36,7 +36,6 @@ this.width = 1200; this.height = 900; this.title = "HelloWorld"; - gameEditor = new GameEditor(); init(); } @@ -88,7 +87,7 @@ gameObject.initComponents(); // コンポーネントの初期化 } } - gameEditor.updateListByScene(currentScene); // ゲームエディタ側にシーン情報を渡す + if(gameEditor != null) gameEditor.updateListByScene(currentScene); // ゲームエディタ側にシーン情報を渡す } public static Window get() { @@ -99,8 +98,14 @@ return window; } + public void runWithEditor() { + gameEditor = new GameEditor(); + run(); + } + public void run() { System.out.println("Hello LWJGL " + Version.getVersion() + "!"); + Window.changeScene(0); loop(); glfwFreeCallbacks(glfwWindow); glfwDestroyWindow(glfwWindow); @@ -154,21 +159,21 @@ glfwShowWindow(glfwWindow); GL.createCapabilities(); - - Window.changeScene(0); } private void loop() { - double beginTime = Time.getTime(); - double endTime; - double dt = -1.0f; + Time.update(); while (!glfwWindowShouldClose(glfwWindow)) { glfwPollEvents(); // ウィンドウイベントをポーリング glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // フレームバッファをクリア + float dt = Time.deltaTime; + if (dt >= 0) { + + resetScene(); boolean isEditorScene = currentScene instanceof EditorScene; for (Entity entity : currentScene.entities.values()) { @@ -179,19 +184,29 @@ } // シーン全体の update を呼び出す - currentScene.update((float) dt); + currentScene.update(dt); currentScene.processTasks(); } glfwSwapBuffers(glfwWindow); // カラーバッファを交換 - endTime = Time.getTime(); - dt = endTime - beginTime; - beginTime = endTime; + Time.update(); } } + //Gameシーン開始時にタイマーをリセット、Editorシーン戻ったときにフラグをfalseにする + private boolean startGameScene = false; + private void resetScene() { + boolean isGameScene = currentScene instanceof GameScene; + if (isGameScene && !startGameScene) { + Time.reset(); + + startGameScene = true; + } + if (!isGameScene) startGameScene = false; + } + public Scene getScene(){ return currentScene; }