diff --git a/GameEngine/src/main/java/gameEngine/GameEditor.java b/GameEngine/src/main/java/gameEngine/GameEditor.java index 1d4b30e..1e6662e 100644 --- a/GameEngine/src/main/java/gameEngine/GameEditor.java +++ b/GameEngine/src/main/java/gameEngine/GameEditor.java @@ -1,5 +1,6 @@ package gameEngine; +import gameEngine.scenes.EditorScene; import gameEngine.views.Button; import gameEngine.scenes.Scene; import gameEngine.views.Sprite; @@ -7,7 +8,7 @@ import gameEngine.views.Window; public class GameEditor { - private Scene scene; + private EditorScene scene; private final String frameImagePath = "GameEngine/resources/EditorFrame.png"; private Sprite[] EditorFrameSprite = new Sprite[4]; @@ -22,7 +23,7 @@ private Text createEntityViewButtonText; public GameEditor(Scene scene) { - this.scene = scene; + this.scene = (EditorScene) scene; initializeEditorComponents(); } @@ -53,7 +54,7 @@ } public void setScene(Scene newScene) { - this.scene = newScene; + this.scene = (EditorScene) newScene; setButtonListeners(); } diff --git a/GameEngine/src/main/java/gameEngine/SwingGameEditor.java b/GameEngine/src/main/java/gameEngine/SwingGameEditor.java index e43fa9e..b5fd16b 100644 --- a/GameEngine/src/main/java/gameEngine/SwingGameEditor.java +++ b/GameEngine/src/main/java/gameEngine/SwingGameEditor.java @@ -183,7 +183,7 @@ } private void createNewGameObject() { - gameScene.addNewObject(); // 新しいGameObjectを作成 + // gameScene.addNewObject(); // 新しいGameObjectを作成 updateGameObjectList(gameScene); // オブジェクトリストの更新 objectList.setSelectedIndex(listModel.getSize() - 1); // 新規作成したオブジェクトを選択 applyGameObjectChanges(); // 作成直後に即座にプロパティを反映させる diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Draggable.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/Draggable.java index fa88f40..f497964 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Draggable.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/Draggable.java @@ -4,6 +4,7 @@ import gameEngine.entites.Entity; import gameEngine.input.Input; import gameEngine.input.MouseInput; +import gameEngine.scenes.EditorScene; import gameEngine.scenes.Scene; import gameEngine.views.Window; @@ -21,7 +22,7 @@ float mouseX = MouseInput.getX(); float mouseY = MouseInput.getY(); - Scene scene = Window.get().getScene(); + EditorScene scene = (EditorScene) Window.get().getScene(); if (scene.getSelectedEntity() == null) { if (Input.GetMouseButtonDown(0) && isMouseOver(mouseX, mouseY)) { diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/TextMesh.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/TextMesh.java index 11f4340..33a8a3f 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/TextMesh.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/TextMesh.java @@ -3,6 +3,7 @@ import gameEngine.entites.Entity; import gameEngine.input.Input; import gameEngine.input.MouseInput; +import gameEngine.scenes.EditorScene; import gameEngine.views.*; import org.joml.Vector3f; @@ -100,7 +101,8 @@ isEditingText = false; setText(inputBuffer.toString()); textRenderer.setColor(Color.WHITE); // 編集終了時に色を戻す - Window.get().getScene().clearSelectedEntity(); + EditorScene scene = (EditorScene) Window.get().getScene(); + scene.clearSelectedEntity(); inputBuffer.setLength(0); // バッファをクリア return; } diff --git a/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java b/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java index 92785ba..8d26c44 100644 --- a/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java +++ b/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java @@ -1,18 +1,39 @@ package gameEngine.scenes; import gameEngine.entites.Entity; +import gameEngine.entites.GameObject; +import gameEngine.entites.gameComponents.ComponentView; +import gameEngine.entites.gameComponents.Draggable; +import gameEngine.entites.gameComponents.EntityView; +import gameEngine.entites.gameComponents.TextMesh; +import gameEngine.views.Window; +import org.joml.Vector3f; + import java.util.HashMap; import static org.lwjgl.opengl.GL11.glClearColor; public class EditorScene extends Scene { + public HashMap editorEntities = new HashMap<>(); + private Entity selectedEntity = null; + + public Entity getEditorEntity(String eid) { + return editorEntities.get(eid); + } + public void addEditorEntity(String eid, Entity entity) { + editorEntities.put(eid, entity); + } + public void removeEditorEntity(String eid) { + editorEntities.remove(eid); + } + public EditorScene(){ System.out.println("Active Editor scene"); glClearColor(1, 1, 1, 0); } - public EditorScene(HashMap entities){ - this.entities = entities; + public EditorScene(HashMap editorEntities){ + this.editorEntities = editorEntities; System.out.println("Active Editor scene"); glClearColor(1, 1, 1, 0); } @@ -23,4 +44,73 @@ changeScene(1, dt); //Gameシーンへの以降処理 } + private GameObject createGameObject(){ + int entitiesLength = editorEntities.size(); + String newId = Integer.toString(entitiesLength); + GameObject gameObject = new GameObject(newId); + addEditorEntity(newId, gameObject); + return gameObject; + } + + public Runnable addNewEntity() { + enqueueTask(this::addEntityView); + return null; + } + + private void addEntityView(){ + GameObject object = createGameObject(); + object.transform.setPosition((float) Window.get().width / 2 ,(float) Window.get().height /2, 0); + object.addComponent(new EntityView(object)); + object.addComponent(new TextMesh(object, "Entity", 16)); + object.getComponent(TextMesh.class).setLocalPosition(new Vector3f(0,-20,0)); + } + + public Runnable addNewComponent() { + enqueueTask(this::addComponentView); + return null; + } + + private void addComponentView(){ + GameObject object = createGameObject(); + object.transform.setPosition((float) Window.get().width / 2 ,(float) Window.get().height /2, 0); + object.addComponent(new ComponentView(object)); + object.addComponent(new TextMesh(object, "Mesh", 20)); + object.getComponent(TextMesh.class).setLocalPosition(new Vector3f(10,2,0)); + } + + ///---------------------------------------------------------------- + /// 選択、ドラッグ処理 + ///---------------------------------------------------------------- + + public Entity getSelectedEntity() { + return selectedEntity; + } + + public void setSelectedEntity(Entity entity) { + selectedEntity = entity; + System.out.println("Selected Entity: " + selectedEntity); + } + + public void clearSelectedEntity() { + selectedEntity = null; + } + + public void updateDraggable() { + if (selectedEntity != null) { + GameObject gameObject = (GameObject) selectedEntity; + if (gameObject == null) return; + if (gameObject.getComponent(Draggable.class) != null) { + gameObject.getComponent(Draggable.class).handleDragging(); + } + } else { + for (Entity entity : editorEntities.values()) { + if (entity instanceof GameObject) { + GameObject gameObject = (GameObject) entity; + if (gameObject.getComponent(Draggable.class) != null) { + gameObject.getComponent(Draggable.class).handleDragging(); + } + } + } + } + } } diff --git a/GameEngine/src/main/java/gameEngine/scenes/GameScene.java b/GameEngine/src/main/java/gameEngine/scenes/GameScene.java index e79419b..d102d48 100644 --- a/GameEngine/src/main/java/gameEngine/scenes/GameScene.java +++ b/GameEngine/src/main/java/gameEngine/scenes/GameScene.java @@ -1,14 +1,21 @@ package gameEngine.scenes; import gameEngine.entites.Entity; +import gameEngine.entites.GameObject; +import gameEngine.entites.gameComponents.ComponentView; +import gameEngine.entites.gameComponents.EntityView; + import java.util.HashMap; import static org.lwjgl.opengl.GL11.glClearColor; public class GameScene extends Scene { - public GameScene(HashMap entities) { - this.entities = entities;//Editorのentitiesを持ってくる + public GameScene(HashMap editorEntities) { + for(Entity EditorEntity : editorEntities.values()){ + GameObject editorObject = (GameObject) EditorEntity; + if(editorObject.getComponent(EntityView.class) != null) addNewObject(editorObject); + } System.out.println("Active Game scene"); glClearColor(1, 1, 1, 0); } diff --git a/GameEngine/src/main/java/gameEngine/scenes/Scene.java b/GameEngine/src/main/java/gameEngine/scenes/Scene.java index 4bdb091..6de3cf8 100644 --- a/GameEngine/src/main/java/gameEngine/scenes/Scene.java +++ b/GameEngine/src/main/java/gameEngine/scenes/Scene.java @@ -21,47 +21,13 @@ private Camera camera; public HashMap entities = new HashMap<>(); - private Entity selectedEntity = null; + private final Queue taskQueue = new LinkedList<>(); private boolean changingScene = false; private float timeToChangeScene = 2.0f; private final Color editorBackColor = new Color(1,1,1,0); - public Entity getSelectedEntity() { - return selectedEntity; - } - - public void setSelectedEntity(Entity entity) { - selectedEntity = entity; - System.out.println("Selected Entity: " + selectedEntity); - } - - public void clearSelectedEntity() { - selectedEntity = null; - } - - public void updateDraggable() { - // 選択済みのエンティティのみドラッグ - if (selectedEntity != null) { - GameObject gameObject = (GameObject) selectedEntity; - if (gameObject == null) return; - if (gameObject.getComponent(Draggable.class) != null) { - gameObject.getComponent(Draggable.class).handleDragging(); - } - } else { - // クリックで選択 - for (Entity entity : entities.values()) { - if (entity instanceof GameObject) { - GameObject gameObject = (GameObject) entity; - if (gameObject.getComponent(Draggable.class) != null) { - gameObject.getComponent(Draggable.class).handleDragging(); - } - } - } - } - } - public Scene(){ } @@ -84,20 +50,10 @@ entities.remove(eid); } - public Runnable addNewObject() { - enqueueTask(this::addNewGameObject); - return null; + public void addNewObject(GameObject editorObject) { + enqueueTask(() -> addNewGameObject(editorObject)); } - public Runnable addNewComponent() { - enqueueTask(this::addComponentView); - return null; - } - - public Runnable addNewEntity() { - enqueueTask(this::addEntityView); - return null; - } private GameObject createGameObject(){ int entitiesLength = entities.size(); @@ -107,29 +63,14 @@ return gameObject; } - private void addNewGameObject(){ + private void addNewGameObject(GameObject editorObject) { GameObject object = createGameObject(); + object.transform.setPosition(editorObject.transform.position.x,editorObject.transform.position.y,0); object.addComponent(new Mesh(object, Mesh.MeshType.SPRITE, "GameEngine/resources/0.png")); - object.transform.setPosition((float) Window.get().width / 2 - object.getComponent(Mesh.class).getDisplayedWidth()/2 , - (float) Window.get().height / 2 - object.getComponent(Mesh.class).getDisplayedHeight()/2, 0); + if(editorObject.getComponent(ComponentView.class) != null) { + + } object.addComponent(new MoveImage(object)); - - } - - private void addEntityView(){ - GameObject object = createGameObject(); - object.transform.setPosition((float) Window.get().width / 2 ,(float) Window.get().height /2, 0); - object.addComponent(new EntityView(object)); - object.addComponent(new TextMesh(object, "Entity", 16)); - object.getComponent(TextMesh.class).setLocalPosition(new Vector3f(0,-20,0)); - } - - private void addComponentView(){ - GameObject object = createGameObject(); - object.transform.setPosition((float) Window.get().width / 2 ,(float) Window.get().height /2, 0); - object.addComponent(new ComponentView(object)); - object.addComponent(new TextMesh(object, "Mesh", 20)); - object.getComponent(TextMesh.class).setLocalPosition(new Vector3f(10,2,0)); } public void addComponentToGameObject(GameObject gameObject, GameComponent component) { @@ -140,7 +81,7 @@ enqueueTask(() -> gameObject.removeComponent(component)); } - private synchronized void enqueueTask(Runnable task) { + synchronized void enqueueTask(Runnable task) { taskQueue.add(task); } diff --git a/GameEngine/src/main/java/gameEngine/views/Window.java b/GameEngine/src/main/java/gameEngine/views/Window.java index da3684e..aec6fbf 100644 --- a/GameEngine/src/main/java/gameEngine/views/Window.java +++ b/GameEngine/src/main/java/gameEngine/views/Window.java @@ -30,11 +30,11 @@ public int height; private String title; private long glfwWindow; - private static SwingGameEditor swingGameEditor; + //private static SwingGameEditor swingGameEditor; private static GameEditor gameEditor; public ConnectionManager connectionManager = new ConnectionManager(); - private static HashMap sceneEntities; + private static HashMap editorEntities; private Window() { this.width = 1200; @@ -46,10 +46,10 @@ public static void changeScene(int newScene) { switch (newScene) { case 0: // EditorScene - if (sceneEntities == null) { + if (editorEntities == null) { currentScene = new EditorScene(); } else { - currentScene = new EditorScene(sceneEntities); + currentScene = new EditorScene(editorEntities); for (Entity entity : currentScene.entities.values()) { entity.restoreOriginalTransform(); } @@ -58,12 +58,12 @@ initializeSceneEntities(); break; case 1: // GameScene - // Transform保存 for (Entity entity : currentScene.entities.values()) { entity.saveOriginalTransform(); } - sceneEntities = currentScene.entities; - HashMap gameSceneEntities = new HashMap<>(sceneEntities); + EditorScene editorScene = (EditorScene) currentScene; + editorEntities = editorScene.editorEntities; + HashMap gameSceneEntities = new HashMap<>(editorEntities); currentScene = new GameScene(gameSceneEntities); initializeSceneEntities(); break; @@ -80,7 +80,7 @@ gameObject.initComponents(); // コンポーネントの初期化 } } - if(swingGameEditor != null) swingGameEditor.updateListByScene(currentScene); // ゲームエディタ側にシーン情報を渡す + //if(swingGameEditor != null) swingGameEditor.updateListByScene(currentScene); // ゲームエディタ側にシーン情報を渡す } @@ -93,7 +93,7 @@ } public void runWithEditor() { - swingGameEditor = new SwingGameEditor(); + //swingGameEditor = new SwingGameEditor(); run(); } @@ -170,19 +170,10 @@ if(currentScene instanceof EditorScene) { connectionManager.update(); - for (Entity entity : currentScene.entities.values()) { + for (Entity entity : ((EditorScene) currentScene).editorEntities.values()) { if (entity instanceof GameObject) { GameObject gameObject = (GameObject) entity; - if(gameObject.getComponent(EntityView.class) != null){ - gameObject.getComponent(EntityView.class).update(); - } - if(gameObject.getComponent(ComponentView.class) != null){ - gameObject.getComponent(ComponentView.class).update(); - } - if(gameObject.getComponent(TextMesh.class) != null){ - gameObject.getComponent(TextMesh.class).update(); - } - if(gameObject.getComponent(ButtonComponent.class) != null)gameObject.getComponent(ButtonComponent.class).update(); + gameObject.updateComponents(); } } gameEditor.update(); @@ -191,6 +182,9 @@ for (Entity entity : currentScene.entities.values()) { if (entity instanceof GameObject) { GameObject gameObject = (GameObject) entity; + if(gameObject.getComponent(EntityView.class) != null) continue; + if(gameObject.getComponent(ComponentView.class) != null) continue; + if(gameObject.getComponent(TextMesh.class) != null) continue; gameObject.updateComponents(); } }