diff --git a/GameEngine/src/main/java/gameEngine/GameEditor.java b/GameEngine/src/main/java/gameEngine/GameEditor.java index 8de7a0e..8a0b4a3 100644 --- a/GameEngine/src/main/java/gameEngine/GameEditor.java +++ b/GameEngine/src/main/java/gameEngine/GameEditor.java @@ -71,7 +71,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 +211,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..207641b 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/ColorController.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/ColorController.java @@ -8,6 +8,11 @@ public class ColorController extends GameComponent { private Color color = new Color(0,0,0); + @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..f1b214c 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/CopyEntity.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/CopyEntity.java @@ -8,12 +8,18 @@ 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)){ window.getScene().Instantiate((GameObject) entity); 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..a5b9c2b 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java @@ -33,7 +33,8 @@ 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..1822cee 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/MoveImage.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/MoveImage.java @@ -9,12 +9,18 @@ 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)) { float y = entity.transform.position.y; 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..57d42a2 100644 --- a/GameEngine/src/main/java/gameEngine/scenes/Scene.java +++ b/GameEngine/src/main/java/gameEngine/scenes/Scene.java @@ -71,12 +71,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 +94,10 @@ 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)); + } else { + GameComponent copiedComponent = gameComponent.copy(); + newGameObject.addComponent(copiedComponent);//Newしないとできないかも } } diff --git a/GameEngine/src/main/java/gameEngine/views/Window.java b/GameEngine/src/main/java/gameEngine/views/Window.java index 32ee4d8..a14618b 100644 --- a/GameEngine/src/main/java/gameEngine/views/Window.java +++ b/GameEngine/src/main/java/gameEngine/views/Window.java @@ -88,7 +88,7 @@ gameObject.initComponents(); // コンポーネントの初期化 } } - gameEditor.updateListByScene(currentScene); // ゲームエディタ側にシーン情報を渡す + if(gameEditor != null) gameEditor.updateListByScene(currentScene); // ゲームエディタ側にシーン情報を渡す } public static Window get() { @@ -159,16 +159,18 @@ } 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 +181,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; }