diff --git a/GameEngine/src/main/java/gameEngine/GameEditor.java b/GameEngine/src/main/java/gameEngine/GameEditor.java index 0b114da..65fdf84 100644 --- a/GameEngine/src/main/java/gameEngine/GameEditor.java +++ b/GameEngine/src/main/java/gameEngine/GameEditor.java @@ -3,6 +3,8 @@ import gameEngine.entites.Entity; import gameEngine.entites.GameObject; import gameEngine.entites.gameComponents.GameComponent; +import gameEngine.entites.gameComponents.Mesh; +import gameEngine.entites.gameComponents.MoveImage; import gameEngine.scenes.*; import javax.swing.*; @@ -24,6 +26,7 @@ private JTextField scaleXField, scaleYField, scaleZField; private JTextField nameField; private Scene gameScene; + private Timer updateTimer; public GameEditor() { setTitle("Game Object Editor"); @@ -31,6 +34,7 @@ setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // 閉じられないようにする setLayout(null); // レイアウトを絶対座標に設定 initializeUIComponents();// 各UI要素の初期化 + initializeUpdateTimer(); // 定期的にリスト更新を行うタイマーを初期化 setVisible(true); // フレームを表示 } @@ -40,43 +44,11 @@ objectList = new JList<>(listModel); JScrollPane scrollPane = new JScrollPane(objectList); - objectList.setCellRenderer(new ListCellRenderer() { - @Override - public Component getListCellRendererComponent(JList list, String value, int index, boolean isSelected, boolean cellHasFocus) { - JLabel label = new JLabel(); - Entity entity = gameScene.getEntity(value); - label.setText(entity.name); // リストには名前を表示する - if (isSelected) { - label.setBackground(list.getSelectionBackground()); - label.setForeground(list.getSelectionForeground()); - } else { - label.setBackground(list.getBackground()); - label.setForeground(list.getForeground()); - } - label.setOpaque(true); // 背景色が表示されるようにする - return label; - } - }); - - componentListModel = new DefaultListModel(); - componentList = new JList(componentListModel); + objectList.setCellRenderer(createEntityRenderer()); + componentListModel = new DefaultListModel<>(); + componentList = new JList<>(componentListModel); JScrollPane componentScrollPane = new JScrollPane(componentList); - componentList.setCellRenderer(new ListCellRenderer() { - @Override - public Component getListCellRendererComponent(JList list, GameComponent value, int index, boolean isSelected, boolean cellHasFocus) { - JLabel label = new JLabel(); - label.setText(value.getClass().getSimpleName()); // クラス名を表示 - if (isSelected) { - label.setBackground(list.getSelectionBackground()); - label.setForeground(list.getSelectionForeground()); - } else { - label.setBackground(list.getBackground()); - label.setForeground(list.getForeground()); - } - label.setOpaque(true); // 背景色が表示されるようにする - return label; - } - }); + componentList.setCellRenderer(createComponentRenderer()); // 各UIコンポーネントの作成と配置 nameField = new JTextField(20); @@ -94,7 +66,7 @@ scaleYField = new JTextField(5); scaleZField = new JTextField(5); - JButton newGameObjectButton = new JButton("New Entity"); + JButton newGameObjectButton = new JButton("Add Entity"); newGameObjectButton.addActionListener(e -> createNewGameObject()); JButton addComponentButton = new JButton("Add Component"); @@ -134,6 +106,45 @@ } }); } + private JTextField createTextField() { + return new JTextField(5); + } + + // タイマーによる定期的なリスト更新 + private void initializeUpdateTimer() { + updateTimer = new Timer(1000, e -> { + updateGameObjectList(gameScene); + if (objectList.getSelectedValue() != null) { + Entity selectedEntity = gameScene.getEntity(objectList.getSelectedValue()); + if (selectedEntity instanceof GameObject) { + updateComponentList((GameObject) selectedEntity); + } + } + }); + updateTimer.start(); + } + + private ListCellRenderer createEntityRenderer() { + return (list, value, index, isSelected, cellHasFocus) -> { + JLabel label = new JLabel(); + Entity entity = gameScene.getEntity(value); + label.setText(entity.name); + label.setBackground(isSelected ? list.getSelectionBackground() : list.getBackground()); + label.setForeground(isSelected ? list.getSelectionForeground() : list.getForeground()); + label.setOpaque(true); + return label; + }; + } + + private ListCellRenderer createComponentRenderer() { + return (list, value, index, isSelected, cellHasFocus) -> { + JLabel label = new JLabel(value.getClass().getSimpleName()); + label.setBackground(isSelected ? list.getSelectionBackground() : list.getBackground()); + label.setForeground(isSelected ? list.getSelectionForeground() : list.getForeground()); + label.setOpaque(true); + return label; + }; + } private void setComponentBounds(Component component, int x, int y, int width, int height) { component.setBounds(x, y, width, height); @@ -141,10 +152,8 @@ } private void createNewGameObject() { - gameScene.createNewObject(); // 新しいGameObjectを作成 + gameScene.addNewObject(); // 新しいGameObjectを作成 updateGameObjectList(gameScene); // オブジェクトリストの更新 - objectList.repaint(); // リストを再描画 - objectList.revalidate(); // リストを再構築 objectList.setSelectedIndex(listModel.getSize() - 1); // 新規作成したオブジェクトを選択 applyGameObjectChanges(); // 作成直後に即座にプロパティを反映させる } @@ -155,7 +164,8 @@ Entity selectedEntity = gameScene.getEntity(selectedIdStr); if (selectedEntity instanceof GameObject) { GameObject gameObject = (GameObject) selectedEntity; - gameScene.addComponentObjectSelect(gameObject); // コンポーネントの追加処理 + System.out.println("仮でMeshコンポーネントを付与します"); + gameScene.addComponentToGameObject(gameObject, new MoveImage(gameObject)); updateComponentList(gameObject); // コンポーネントリストの更新 updateGameObjectList(gameScene); // オブジェクトリストの更新 JOptionPane.showMessageDialog(this, "Component Added to " + selectedEntity.name); @@ -171,9 +181,8 @@ GameObject gameObject = (GameObject) selectedEntity; GameComponent selectedComponent = componentList.getSelectedValue(); // GameComponentとして取得 if (selectedComponent != null) { - gameScene.removeComponentObjectSelect(gameObject, selectedComponent); // GameComponentオブジェクトを渡す + gameScene.removeComponentFromGameObject(gameObject, selectedComponent); updateComponentList(gameObject); // コンポーネントリストの更新 - updateGameObjectList(gameScene); // オブジェクトリストの更新 JOptionPane.showMessageDialog(this, "Component Removed from " + selectedEntity.name); } } @@ -187,10 +196,6 @@ listModel.addElement(entity.getId()); // そのままIDをリストに追加 } objectList.repaint(); // リストを再描画 - objectList.revalidate(); // リストを再構築 - if (!listModel.isEmpty()) { - objectList.setSelectedIndex(0); // 最初の項目を自動選択 - } } private void updateComponentList(GameObject gameObject) { @@ -199,11 +204,7 @@ for (GameComponent component : components) { componentListModel.addElement(component); // コンポーネントを追加 } - if (components.isEmpty()) { - // 選択解除して、空の状態を扱う - componentList.clearSelection(); - componentList.repaint(); - } + componentList.repaint(); } // 選択されたGameObjectのプロパティをロードする @@ -213,8 +214,6 @@ Entity selectedEntity = gameScene.getEntity(selectedIdStr); // IDのまま取得 if (selectedEntity != null) { loadObjectProperties(selectedEntity); - - // コンポーネントリストの更新 if (selectedEntity instanceof GameObject) { updateComponentList((GameObject) selectedEntity); } @@ -253,7 +252,6 @@ ); updateGameObjectList(gameScene); // オブジェクトリストの再描画 - objectList.repaint(); // リストの再描画を強制 } } } diff --git a/GameEngine/src/main/java/gameEngine/entites/GameObject.java b/GameEngine/src/main/java/gameEngine/entites/GameObject.java index eff76c0..e533f91 100644 --- a/GameEngine/src/main/java/gameEngine/entites/GameObject.java +++ b/GameEngine/src/main/java/gameEngine/entites/GameObject.java @@ -1,6 +1,7 @@ package gameEngine.entites; import gameEngine.entites.gameComponents.GameComponent; +import gameEngine.entites.gameComponents.Mesh; import java.util.ArrayList; import java.util.List; @@ -39,9 +40,15 @@ } } - public void updateComponents() { + public void updateComponents(boolean isEditorScene) { for (GameComponent component : gameComponents) { - component.update(); + if (isEditorScene) { + if (component instanceof Mesh) { + component.update(); + } + } else { + component.update(); + } } } diff --git a/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java b/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java index ff245c4..8162040 100644 --- a/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java +++ b/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java @@ -14,11 +14,11 @@ System.out.println("Active Editor scene"); glClearColor(1, 1, 1, 0); - //GameObjectの追加 - createGameObject(); + /*//GameObjectの追加 + addNewObject(); GameObject g0 = (GameObject) getEntity("0"); g0.addComponent(new ColorController()); - g0.setName("ColorController"); + g0.setName("ColorController");*/ } public EditorScene(HashMap entities){ this.entities = entities; @@ -29,33 +29,6 @@ @Override public void update(float dt) { changeScene(1, dt); //Gameシーンへの以降処理 - - if(isCreateObject){ - createGameObject(); - isCreateObject = false; - } - - if(isAddComponent){ - addComponent(); - addComponentObject = null; - isAddComponent = false; - } - - if(isRemoveComponent){ - removeComponent(); - removeComponentObject = null; - removeComponent = null; - isRemoveComponent = false; - } - } - - private void createGameObject(){ - int entitiesLength = entities.size(); - String newId = Integer.toString(entitiesLength); - addEntity(newId, new GameObject(newId)); - GameObject newGameObject = (GameObject) getEntity(newId); - newGameObject.addComponent(new Mesh(getEntity(newId), Mesh.MeshType.SPRITE, "test.png")); - newGameObject.setName("NewEntity" + newId); } } diff --git a/GameEngine/src/main/java/gameEngine/scenes/GameScene.java b/GameEngine/src/main/java/gameEngine/scenes/GameScene.java index 25485f8..e79419b 100644 --- a/GameEngine/src/main/java/gameEngine/scenes/GameScene.java +++ b/GameEngine/src/main/java/gameEngine/scenes/GameScene.java @@ -1,15 +1,6 @@ package gameEngine.scenes; import gameEngine.entites.Entity; -import gameEngine.entites.GameObject; -import gameEngine.entites.gameComponents.ColorController; -import gameEngine.entites.gameComponents.GameComponent; -import gameEngine.entites.gameComponents.Mesh; -import gameEngine.entites.gameComponents.MoveImage; -import gameEngine.input.Input; -import gameEngine.views.Window; - -import java.awt.event.KeyEvent; import java.util.HashMap; import static org.lwjgl.opengl.GL11.glClearColor; diff --git a/GameEngine/src/main/java/gameEngine/scenes/Scene.java b/GameEngine/src/main/java/gameEngine/scenes/Scene.java index 46dbdd6..7bf6e67 100644 --- a/GameEngine/src/main/java/gameEngine/scenes/Scene.java +++ b/GameEngine/src/main/java/gameEngine/scenes/Scene.java @@ -4,6 +4,7 @@ import gameEngine.entites.Entity; import gameEngine.entites.GameObject; import gameEngine.entites.gameComponents.GameComponent; +import gameEngine.entites.gameComponents.Mesh; import gameEngine.entites.gameComponents.MoveImage; import gameEngine.input.Input; import gameEngine.views.Color; @@ -11,6 +12,8 @@ import java.awt.event.KeyEvent; import java.util.HashMap; +import java.util.LinkedList; +import java.util.Queue; import static org.lwjgl.opengl.GL11.glClearColor; @@ -18,18 +21,12 @@ private Camera camera; public HashMap entities = new HashMap<>(); + private Queue taskQueue = new LinkedList<>(); private boolean changingScene = false; private float timeToChangeScene = 2.0f; private final Color editorBackColor = new Color(1,1,1,0); - protected boolean isCreateObject = false; - protected boolean isAddComponent = false; - protected boolean isRemoveComponent = false; - protected GameObject addComponentObject; //コンポーネントを付与する対象オブジェクト - protected GameObject removeComponentObject; //コンポーネントを外す対象オブジェクト - protected GameComponent removeComponent; //外すコンポーネント - public Scene(){ } @@ -52,35 +49,38 @@ entities.remove(eid); } - public void createNewObject(){ - if(isCreateObject) return; - isCreateObject = true; + public void addNewObject() { + enqueueTask(() -> { + int entitiesLength = entities.size(); + String newId = Integer.toString(entitiesLength); + GameObject newGameObject = new GameObject(newId); + addEntity(newId, newGameObject); + newGameObject.addComponent(new Mesh(newGameObject, Mesh.MeshType.SPRITE, "test.png")); + newGameObject.setName("NewEntity" + newId); + }); } - protected void addComponent() { - System.out.println("仮でMeshコンポーネントを付与します"); - addComponentObject.addComponent(new MoveImage(addComponentObject)); - } - protected void removeComponent(){ - removeComponentObject.removeComponent(removeComponent); + // コンポーネントの追加メソッド + public void addComponentToGameObject(GameObject gameObject, GameComponent component) { + enqueueTask(() -> gameObject.addComponent(component)); } - //コンポーネントを追加するオブジェクトを選択 - public void addComponentObjectSelect(GameObject gameObject) { - if(isAddComponent) return; - addComponentObject = gameObject; - isAddComponent = true; + // コンポーネントの削除メソッド + public void removeComponentFromGameObject(GameObject gameObject, GameComponent component) { + enqueueTask(() -> gameObject.removeComponent(component)); } - //コンポーネントを削除するオブジェクトを選択 - public void removeComponentObjectSelect(GameObject gameObject, GameComponent gameComponent){ - if(isRemoveComponent) return; - removeComponentObject = gameObject; - removeComponent = gameComponent; - isRemoveComponent = true; + // タスクを登録 + private void enqueueTask(Runnable task) { + taskQueue.add(task); } - + // タスクの実行 + public void processTasks() { + while (!taskQueue.isEmpty()) { + taskQueue.poll().run(); + } + } void changeScene(int scene, float dt){ if(!changingScene && Input.GetKeyDown(KeyEvent.VK_SPACE)){ @@ -97,7 +97,5 @@ else if(changingScene){ Window.changeScene(scene); } - - } } diff --git a/GameEngine/src/main/java/gameEngine/views/Window.java b/GameEngine/src/main/java/gameEngine/views/Window.java index 0b049f9..28e916d 100644 --- a/GameEngine/src/main/java/gameEngine/views/Window.java +++ b/GameEngine/src/main/java/gameEngine/views/Window.java @@ -147,16 +147,18 @@ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // フレームバッファをクリア if (dt >= 0) { - if (!(currentScene instanceof EditorScene)) { - for (Entity entity : currentScene.entities.values()) { - if (entity instanceof GameObject) { - GameObject gameObject = (GameObject) entity; - gameObject.updateComponents(); - } + boolean isEditorScene = currentScene instanceof EditorScene; + + for (Entity entity : currentScene.entities.values()) { + if (entity instanceof GameObject) { + GameObject gameObject = (GameObject) entity; + gameObject.updateComponents(isEditorScene); } } + // シーン全体の update を呼び出す currentScene.update((float) dt); + currentScene.processTasks(); } glfwSwapBuffers(glfwWindow); // カラーバッファを交換