diff --git a/GameEngine/src/main/java/gameEngine/GameEditor.java b/GameEngine/src/main/java/gameEngine/GameEditor.java index 6c4bb62..3e98fa8 100644 --- a/GameEngine/src/main/java/gameEngine/GameEditor.java +++ b/GameEngine/src/main/java/gameEngine/GameEditor.java @@ -2,18 +2,22 @@ import gameEngine.entites.Entity; import gameEngine.entites.GameObject; +import gameEngine.entites.gameComponents.GameComponent; import gameEngine.scenes.*; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.List; import java.util.Map; public class GameEditor extends JFrame { private JList objectList; private DefaultListModel listModel; + private DefaultListModel componentListModel; + private JList componentList; private JLabel nameLabel, posLabel, rotLabel, scaLabel; private JTextField posXField, posYField, posZField; private JTextField rotXField, rotYField, rotZField; @@ -26,12 +30,8 @@ setSize(600, 500); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // 閉じられないようにする setLayout(null); // レイアウトを絶対座標に設定 - - // 各UI要素の初期化 - initializeUIComponents(); - - // フレームを表示 - setVisible(true); + initializeUIComponents();// 各UI要素の初期化 + setVisible(true); // フレームを表示 } // UI要素を初期化し、配置関数を呼び出す @@ -40,7 +40,6 @@ objectList = new JList<>(listModel); JScrollPane scrollPane = new JScrollPane(objectList); - // カスタムレンダラーを使用して、リストにGameObjectの名前を表示する objectList.setCellRenderer(new ListCellRenderer() { @Override public Component getListCellRendererComponent(JList list, String value, int index, boolean isSelected, boolean cellHasFocus) { @@ -60,6 +59,25 @@ } }); + 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; + } + }); // 各UIコンポーネントの作成と配置 nameField = new JTextField(20); @@ -77,73 +95,61 @@ scaleYField = new JTextField(5); scaleZField = new JTextField(5); - JButton newGameObjectButton = new JButton("New GameObject"); + JButton newGameObjectButton = new JButton("New Entity"); newGameObjectButton.addActionListener(e -> createNewGameObject()); + JButton addComponentButton = new JButton("Add Component"); + addComponentButton.addActionListener(e -> addComponentToGameObject()); + + JButton removeComponentButton = new JButton("Remove Component"); + removeComponentButton.addActionListener(e -> removeComponentFromGameObject()); + JButton applyButton = new JButton("Apply"); applyButton.addActionListener(new ApplyButtonListener()); - // 新たにAddComponentボタンを追加 - JButton addComponentButton = new JButton("Add Component"); - addComponentButton.addActionListener(e -> addComponentToGameObject()); - // 各要素の位置とサイズを設定 setComponentBounds(scrollPane, 10, 10, 150, 400); + setComponentBounds(componentScrollPane, 400, 200, 130, 200); setComponentBounds(nameLabel, 200, 10, 100, 30); setComponentBounds(nameField, 250, 10, 200, 30); - setComponentBounds(posLabel, 200, 50, 100, 30); + setComponentBounds(posLabel, 180, 50, 100, 30); setComponentBounds(posXField, 250, 50, 50, 30); setComponentBounds(posYField, 310, 50, 50, 30); setComponentBounds(posZField, 370, 50, 50, 30); - setComponentBounds(rotLabel, 200, 90, 100, 30); + setComponentBounds(rotLabel, 180, 90, 100, 30); setComponentBounds(rotXField, 250, 90, 50, 30); setComponentBounds(rotYField, 310, 90, 50, 30); setComponentBounds(rotZField, 370, 90, 50, 30); - setComponentBounds(scaLabel, 200, 130, 100, 30); + setComponentBounds(scaLabel, 180, 130, 100, 30); setComponentBounds(scaleXField, 250, 130, 50, 30); setComponentBounds(scaleYField, 310, 130, 50, 30); setComponentBounds(scaleZField, 370, 130, 50, 30); setComponentBounds(newGameObjectButton, 200, 170, 150, 30); - setComponentBounds(applyButton, 200, 210, 150, 30); setComponentBounds(addComponentButton, 200, 250, 150, 30); + setComponentBounds(removeComponentButton, 200, 290, 150, 30); + setComponentBounds(applyButton, 200, 400, 100, 25); - // コンポーネントをフレームに追加 - add(scrollPane); - add(nameLabel); - add(nameField); - add(posLabel); - add(posXField); - add(posYField); - add(posZField); - add(rotLabel); - add(rotXField); - add(rotYField); - add(rotZField); - add(scaLabel); - add(scaleXField); - add(scaleYField); - add(scaleZField); - add(newGameObjectButton); - add(applyButton); - add(addComponentButton); - - // リスト選択時の処理 - objectList.addListSelectionListener(e -> loadSelectedGameObject()); + objectList.addListSelectionListener(e -> { + if (!e.getValueIsAdjusting()) { // ユーザーが調整中でない場合のみ + loadSelectedGameObject(); // オブジェクトをロード + } + }); } - // コンポーネントの位置とサイズを設定する関数 private void setComponentBounds(Component component, int x, int y, int width, int height) { component.setBounds(x, y, width, height); + add(component); //フレームに追加 } - // New GameObjectを作成し、画面を更新 private void createNewGameObject() { - gameScene.createNewObject(); // 新しいGameObjectを作成 - applyGameObjectChanges(); - repaint(); // 画面を再描画 + gameScene.createNewObject(); // 新しいGameObjectを作成 + updateGameObjectList(gameScene); // オブジェクトリストの更新 + objectList.repaint(); // リストを再描画 + objectList.revalidate(); // リストを再構築 + objectList.setSelectedIndex(listModel.getSize() - 1); // 新規作成したオブジェクトを選択 + applyGameObjectChanges(); // 作成直後に即座にプロパティを反映させる } - // GameObjectにコンポーネントを追加する処理 private void addComponentToGameObject() { String selectedIdStr = objectList.getSelectedValue(); if (selectedIdStr != null) { @@ -151,19 +157,56 @@ Entity selectedEntity = gameScene.entities.get(selectedId); if (selectedEntity instanceof GameObject) { GameObject gameObject = (GameObject) selectedEntity; - gameScene.addComponent(gameObject); + gameScene.addComponent(gameObject); // コンポーネントの追加処理 + updateComponentList(gameObject); // コンポーネントリストの更新 + updateGameObjectList(gameScene); // オブジェクトリストの更新 JOptionPane.showMessageDialog(this, "Component Added to " + selectedEntity.name); } } } - // GameObjectのリストを更新 - public void updateGameObjectList(Scene gameScene) { - listModel.clear(); + private void removeComponentFromGameObject() { + String selectedIdStr = objectList.getSelectedValue(); + if (selectedIdStr != null) { + int selectedId = Integer.parseInt(selectedIdStr); + Entity selectedEntity = gameScene.entities.get(selectedId); + if (selectedEntity instanceof GameObject) { + GameObject gameObject = (GameObject) selectedEntity; + GameComponent selectedComponent = componentList.getSelectedValue(); // GameComponentとして取得 + if (selectedComponent != null) { + gameScene.removeComponent(gameObject, selectedComponent); // GameComponentオブジェクトを渡す + updateComponentList(gameObject); // コンポーネントリストの更新 + updateGameObjectList(gameScene); // オブジェクトリストの更新 + JOptionPane.showMessageDialog(this, "Component Removed from " + selectedEntity.name); + } + } + } + } + + private void updateGameObjectList(Scene gameScene) { + listModel.clear(); // リストの初期化 for (Map.Entry entry : gameScene.entities.entrySet()) { Entity entity = entry.getValue(); - listModel.addElement(String.valueOf(entity.getId())); // IDをリストに表示 + listModel.addElement(String.valueOf(entity.getId())); // IDをリストに追加 + } + objectList.repaint(); // リストを再描画 + objectList.revalidate(); // リストを再構築 + if (!listModel.isEmpty()) { + objectList.setSelectedIndex(0); // 最初の項目を自動選択 + } } + + private void updateComponentList(GameObject gameObject) { + componentListModel.clear(); // リストをクリア + List components = gameObject.gameComponents; + for (GameComponent component : components) { + componentListModel.addElement(component); // コンポーネントを追加 + } + if (components.isEmpty()) { + // 選択解除して、空の状態を扱う + componentList.clearSelection(); + componentList.repaint(); + } } // 選択されたGameObjectのプロパティをロードする @@ -173,16 +216,12 @@ int selectedId = Integer.parseInt(selectedIdStr); Entity selectedEntity = gameScene.entities.get(selectedId); if (selectedEntity != null) { - nameField.setText(selectedEntity.name); - posXField.setText(String.valueOf(selectedEntity.transform.position.x)); - posYField.setText(String.valueOf(selectedEntity.transform.position.y)); - posZField.setText(String.valueOf(selectedEntity.transform.position.z)); - rotXField.setText(String.valueOf(selectedEntity.transform.rotation.x)); - rotYField.setText(String.valueOf(selectedEntity.transform.rotation.y)); - rotZField.setText(String.valueOf(selectedEntity.transform.rotation.z)); - scaleXField.setText(String.valueOf(selectedEntity.transform.scale.x)); - scaleYField.setText(String.valueOf(selectedEntity.transform.scale.y)); - scaleZField.setText(String.valueOf(selectedEntity.transform.scale.z)); + loadObjectProperties(selectedEntity); + + // コンポーネントリストの更新 + if (selectedEntity instanceof GameObject) { + updateComponentList((GameObject) selectedEntity); + } } } } @@ -198,7 +237,7 @@ private void applyGameObjectChanges() { String selectedIdStr = objectList.getSelectedValue(); if (selectedIdStr != null) { - int selectedId = Integer.parseInt(selectedIdStr); // IDとして扱う + int selectedId = Integer.parseInt(selectedIdStr); Entity selectedEntity = gameScene.entities.get(selectedId); if (selectedEntity != null) { selectedEntity.name = nameField.getText(); @@ -217,7 +256,9 @@ Float.parseFloat(scaleYField.getText()), Float.parseFloat(scaleZField.getText()) ); - updateGameObjectList(gameScene); // リストの更新 + + updateGameObjectList(gameScene); // オブジェクトリストの再描画 + objectList.repaint(); // リストの再描画を強制 } } } @@ -227,6 +268,17 @@ updateGameObjectList(gameScene); } - + private void loadObjectProperties(Entity entity) { + nameField.setText(entity.name); + posXField.setText(String.valueOf(entity.transform.position.x)); + posYField.setText(String.valueOf(entity.transform.position.y)); + posZField.setText(String.valueOf(entity.transform.position.z)); + rotXField.setText(String.valueOf(entity.transform.rotation.x)); + rotYField.setText(String.valueOf(entity.transform.rotation.y)); + rotZField.setText(String.valueOf(entity.transform.rotation.z)); + scaleXField.setText(String.valueOf(entity.transform.scale.x)); + scaleYField.setText(String.valueOf(entity.transform.scale.y)); + scaleZField.setText(String.valueOf(entity.transform.scale.z)); + } }