diff --git a/GameEngine/resources/RemoveButton.png b/GameEngine/resources/RemoveButton.png index c1af199..eea4f45 100644 --- a/GameEngine/resources/RemoveButton.png +++ b/GameEngine/resources/RemoveButton.png Binary files differ diff --git a/GameEngine/src/main/java/gameEngine/ConnectionManager.java b/GameEngine/src/main/java/gameEngine/ConnectionManager.java index e99b6fc..c31296e 100644 --- a/GameEngine/src/main/java/gameEngine/ConnectionManager.java +++ b/GameEngine/src/main/java/gameEngine/ConnectionManager.java @@ -3,8 +3,11 @@ import java.util.ArrayList; import java.util.List; -import gameEngine.entites.GameObject; -import gameEngine.entites.gameComponents.*; +import gameEngine.entites.EditorEntity; +import gameEngine.entites.editorComponents.ComponentView; +import gameEngine.entites.editorComponents.Connection; +import gameEngine.entites.editorComponents.EntityView; +import gameEngine.entites.editorComponents.PortView; import gameEngine.input.Input; import gameEngine.input.MouseInput; @@ -27,12 +30,12 @@ pressedPort.addConnectedPort(port); port.addConnectedPort(pressedPort); - GameObject portParentA = pressedPort.getParent(); - GameObject portParentB = port.getParent(); - if (portParentA.getComponent(EntityView.class) != null) { - portParentA.ComponentConnections.add(portParentB.getComponent(ComponentView.class).connectionType); + EditorEntity portParentA = pressedPort.getParent(); + EditorEntity portParentB = port.getParent(); + if (portParentA.getEditorComponent(EntityView.class) != null) { + portParentA.ComponentConnections.add(portParentB.getEditorComponent(ComponentView.class).connectionType); } else { - portParentB.ComponentConnections.add(portParentA.getComponent(ComponentView.class).connectionType); + portParentB.ComponentConnections.add(portParentA.getEditorComponent(ComponentView.class).connectionType); } } } @@ -71,13 +74,13 @@ portA.removeConnectedPort(portB); portB.removeConnectedPort(portA); - GameObject portParentA = portA.getParent(); - GameObject portParentB = portB.getParent(); + EditorEntity portParentA = portA.getParent(); + EditorEntity portParentB = portB.getParent(); - if (portParentA.getComponent(EntityView.class) != null) { - portParentA.ComponentConnections.remove(portParentB.getComponent(ComponentView.class).connectionType); + if (portParentA.getEditorComponent(EntityView.class) != null) { + portParentA.ComponentConnections.remove(portParentB.getEditorComponent(ComponentView.class).connectionType); } else { - portParentB.ComponentConnections.remove(portParentA.getComponent(ComponentView.class).connectionType); + portParentB.ComponentConnections.remove(portParentA.getEditorComponent(ComponentView.class).connectionType); } } } diff --git a/GameEngine/src/main/java/gameEngine/entites/EditorEntity.java b/GameEngine/src/main/java/gameEngine/entites/EditorEntity.java new file mode 100644 index 0000000..3e022de --- /dev/null +++ b/GameEngine/src/main/java/gameEngine/entites/EditorEntity.java @@ -0,0 +1,51 @@ +package gameEngine.entites; + +import gameEngine.entites.editorComponents.EditorComponent; + +import java.util.ArrayList; +import java.util.List; + +public class EditorEntity extends Entity { + public final List editorComponents = new ArrayList<>(); + public enum Connectiontype {Mesh, MoveImage} + public List ComponentConnections = new ArrayList<>(); + + public EditorEntity(String eid) { + super(eid); + } + + public void updateComponents() { + for (EditorComponent component : editorComponents) { + component.update(); + } + } + + public void addEditorComponent(EditorComponent component) { + for (EditorComponent existingComponent : editorComponents) { + if (existingComponent.getClass().equals(component.getClass())) { + System.out.println("Component already exists: " + component.getClass().getSimpleName()); + return; + } + } + this.editorComponents.add(component); + System.out.println("Editor Component added: " + component.getClass().getSimpleName()); + } + + public void removeEditorComponent(EditorComponent component) { + if (editorComponents.remove(component)) { + System.out.println("Editor Component removed: " + component.getClass().getSimpleName()); + } else { + System.out.println("Editor Component not found: " + component.getClass().getSimpleName()); + } + } + + public T getEditorComponent(Class componentClass){ + for (EditorComponent editorComponent : editorComponents) { + if (componentClass.isInstance(editorComponent)) { + return componentClass.cast(editorComponent); + } + } + return null; + } + +} \ No newline at end of file diff --git a/GameEngine/src/main/java/gameEngine/entites/GameObject.java b/GameEngine/src/main/java/gameEngine/entites/GameObject.java index c172fc7..d06d7b0 100644 --- a/GameEngine/src/main/java/gameEngine/entites/GameObject.java +++ b/GameEngine/src/main/java/gameEngine/entites/GameObject.java @@ -11,8 +11,6 @@ public class GameObject extends Entity { public final List gameComponents = new ArrayList<>(); - public enum Connectiontype {Mesh, MoveImage} - public List ComponentConnections = new ArrayList<>(); public GameObject(String id) { super(id); diff --git a/GameEngine/src/main/java/gameEngine/entites/editorComponents/ComponentView.java b/GameEngine/src/main/java/gameEngine/entites/editorComponents/ComponentView.java new file mode 100644 index 0000000..b6e5974 --- /dev/null +++ b/GameEngine/src/main/java/gameEngine/entites/editorComponents/ComponentView.java @@ -0,0 +1,52 @@ +package gameEngine.entites.editorComponents; + +import gameEngine.entites.EditorEntity; +import gameEngine.views.Sprite; +import org.joml.Vector3f; + +public class ComponentView extends Draggable{ + private final Sprite sprite; + public EditorEntity.Connectiontype connectionType; + private final PortView portview; + + public ComponentView(EditorEntity parent, EditorEntity.Connectiontype connectionType){ + this.parent = parent; + this.sprite = new Sprite("GameEngine/resources/ComponentView.png"); + sprite.updateSpriteDimensions(); + portview = new PortView(PortView.PortType.OUT, parent); + this.connectionType = connectionType; + } + + @Override + public void init(){ + sprite.update(); + sprite.updateSpriteDimensions(); + } + + @Override + public void update() { + sprite.setPosition(parent.transform.position); + sprite.setRotation(parent.transform.rotation); + sprite.setScale(parent.transform.scale); + sprite.update(); + Vector3f pos = new Vector3f(parent.transform.position.x+92,parent.transform.position.y,parent.transform.position.z); + portview.update(pos, parent.transform.rotation, parent.transform.scale); + portview.handleDragging(); + } + + @Override + protected boolean isMouseOver(float mouseX, float mouseY) { + return sprite.isMouseOver(mouseX, mouseY); + } + + @Override + protected void draggingAction(float mouseX, float mouseY) { + sprite.setPosition(mouseX - sprite.getDisplayedWidth() / 2, + mouseY - sprite.getDisplayedHeight() / 2); + } + + @Override + public EditorComponent copy() { + return this; + } +} diff --git a/GameEngine/src/main/java/gameEngine/entites/editorComponents/Connection.java b/GameEngine/src/main/java/gameEngine/entites/editorComponents/Connection.java new file mode 100644 index 0000000..855a704 --- /dev/null +++ b/GameEngine/src/main/java/gameEngine/entites/editorComponents/Connection.java @@ -0,0 +1,45 @@ +package gameEngine.entites.editorComponents; + +import gameEngine.entites.editorComponents.PortView; +import gameEngine.views.LineRenderer; +import gameEngine.views.Sprite; +import org.joml.Vector3f; + +public class Connection { + private final PortView portA; + private final PortView portB; + private final LineRenderer lineRenderer; + private final Sprite removeButtonSprite; + + public Connection(PortView inPort, PortView outPort) { + this.portA = inPort; + this.portB = outPort; + this.lineRenderer = new LineRenderer("GameEngine/resources/Line.png"); + this.removeButtonSprite = new Sprite("GameEngine/resources/RemoveButton.png"); + } + + public void render() { + Vector3f posA = portA.getPosition(); + Vector3f posB = portB.getPosition(); + + lineRenderer.updateLine(portA.getPosition(), portB.getPosition(), 3); + lineRenderer.render(); + + Vector3f buttonPosition = lineRenderer.calculatePosition(posA, posB); + removeButtonSprite.setPosition(buttonPosition.x, buttonPosition.y - 8); + removeButtonSprite.setScale(1,1,1); + removeButtonSprite.update(); + } + + public boolean isRemoveButtonClicked(float mouseX, float mouseY) { + return removeButtonSprite.isMouseOver(mouseX, mouseY); + } + + public PortView getPortA() { + return portA; + } + + public PortView getPortB() { + return portB; + } +} diff --git a/GameEngine/src/main/java/gameEngine/entites/editorComponents/Draggable.java b/GameEngine/src/main/java/gameEngine/entites/editorComponents/Draggable.java new file mode 100644 index 0000000..e453d7a --- /dev/null +++ b/GameEngine/src/main/java/gameEngine/entites/editorComponents/Draggable.java @@ -0,0 +1,45 @@ +package gameEngine.entites.editorComponents; + +import gameEngine.entites.EditorEntity; +import gameEngine.entites.Entity; +import gameEngine.input.Input; +import gameEngine.input.MouseInput; +import gameEngine.scenes.EditorScene; +import gameEngine.views.Window; + +public abstract class Draggable extends EditorComponent { + protected EditorEntity parent; + protected boolean isDraggable = true; + protected boolean isDragging = false; + + public void setDraggable(boolean draggable) { + this.isDraggable = draggable; + } + + public void handleDragging() { + if (!isDraggable) return; + + float mouseX = MouseInput.getX(); + float mouseY = MouseInput.getY(); + EditorScene scene = (EditorScene) Window.get().getScene(); + + if (scene.getSelectedEntity() == null) { + if (Input.GetMouseButtonDown(0) && isMouseOver(mouseX, mouseY)) { + isDragging = true; + scene.setSelectedEntity(parent); // エンティティを選択 + } + } + + if (isDragging && Input.GetMouseButton(0)) { + draggingAction(mouseX, mouseY); // ドラッグ中の処理 + } + + if (Input.GetMouseButtonUp(0)) { + isDragging = false; + scene.clearSelectedObject(); // ドラッグ終了時に選択解除 + } + } + + protected abstract boolean isMouseOver(float mouseX, float mouseY); + protected abstract void draggingAction(float mouseX, float mouseY); +} diff --git a/GameEngine/src/main/java/gameEngine/entites/editorComponents/EditorComponent.java b/GameEngine/src/main/java/gameEngine/entites/editorComponents/EditorComponent.java new file mode 100644 index 0000000..1104b0e --- /dev/null +++ b/GameEngine/src/main/java/gameEngine/entites/editorComponents/EditorComponent.java @@ -0,0 +1,28 @@ +package gameEngine.entites.editorComponents; + +import org.joml.Vector3f; + +public abstract class EditorComponent { + Vector3f localPosition = new Vector3f(0,0,0); + Vector3f localRotation = new Vector3f(0,0,0); + Vector3f localScale = new Vector3f(0,0,0); + public void init() { + // 初期化処理 + } + + public void update() { + // 更新処理 + } + + public abstract EditorComponent copy(); + + public void setLocalPosition(Vector3f pos){ + localPosition.set(pos); + } + public void setLocalRotation(Vector3f rot){ + localRotation.set(rot); + } + public void setLocalScale(Vector3f scale){ + localScale.set(scale); + } +} \ No newline at end of file diff --git a/GameEngine/src/main/java/gameEngine/entites/editorComponents/EditorText.java b/GameEngine/src/main/java/gameEngine/entites/editorComponents/EditorText.java new file mode 100644 index 0000000..1d987fd --- /dev/null +++ b/GameEngine/src/main/java/gameEngine/entites/editorComponents/EditorText.java @@ -0,0 +1,130 @@ +package gameEngine.entites.editorComponents; + +import gameEngine.entites.EditorEntity; +import gameEngine.input.Input; +import gameEngine.input.MouseInput; +import gameEngine.scenes.EditorScene; +import gameEngine.views.*; +import org.joml.Vector3f; + +import static org.lwjgl.glfw.GLFW.*; + +public class EditorText extends Draggable{ + + private Text textRenderer; + private boolean isEditingText = false; + private StringBuilder inputBuffer = new StringBuilder(); + + public EditorText(EditorEntity parent, String text, int textSize) { + this.parent = parent; + this.textRenderer = new Text(parent.transform.position.x, parent.transform.position.y, text, textSize); + } + + public EditorText(EditorText original, EditorEntity newParent) { + this.parent = newParent; + this.textRenderer = new Text( + newParent.transform.position.x, + newParent.transform.position.y, + original.textRenderer.text, + original.textRenderer.textSize + ); + } + + @Override + public EditorComponent copy() { + return this; + } + + @Override + public void init() { + textRenderer.update(); + } + + @Override + public void update() { + handleRightClickToggle(); + if (isEditingText) { + handleTextEditing(); + } else { + Vector3f globalPosition = new Vector3f(parent.transform.position).add(localPosition); + textRenderer.setPosition(globalPosition); + Vector3f globalRotation = new Vector3f(parent.transform.rotation).add(localRotation); + textRenderer.setRotation(globalRotation); + Vector3f globalScale = new Vector3f(parent.transform.scale).add(localScale); + textRenderer.setScale(globalScale); + textRenderer.update(); + } + } + + @Override + protected boolean isMouseOver(float mouseX, float mouseY) { + return textRenderer.isMouseOver(mouseX, mouseY); + } + + @Override + protected void draggingAction(float mouseX, float mouseY) { + textRenderer.setPosition(mouseX, mouseY); + } + + public void setText(String newText){ + textRenderer.setText(newText); + } + + public void setTextSize(int newTextSize) { + textRenderer.setTextSize(newTextSize); + } + + public void setColor(Color color){ + textRenderer.setColor(color); + } + + public int getTextSize(){ + return textRenderer.textSize; + } + + private void handleRightClickToggle() { + if (Input.GetMouseButtonDown(GLFW_MOUSE_BUTTON_RIGHT) && isMouseOver(MouseInput.getX(), MouseInput.getY())) { + isEditingText = !isEditingText; // 右クリックで編集モードのトグル + if (isEditingText) { + inputBuffer = new StringBuilder(textRenderer.text); // 現在のテキストをバッファにコピー + textRenderer.setColor(Color.GRAY); // 編集中は灰色に変更 + } else { + textRenderer.setColor(textRenderer.color); // 編集終了時に色を戻す + setText(inputBuffer.toString()); + } + } + } + + private void handleTextEditing() { + // エンターキーで編集終了 + if (Input.GetKeyDown(GLFW_KEY_ENTER)) { + isEditingText = false; + setText(inputBuffer.toString()); + textRenderer.setColor(Color.WHITE); // 編集終了時に色を戻す + EditorScene scene = (EditorScene) Window.get().getScene(); + scene.clearSelectedObject(); + inputBuffer.setLength(0); // バッファをクリア + return; + } + + // バックスペースキーで文字削除 + if (Input.GetKeyDown(GLFW_KEY_BACKSPACE)) { + if (inputBuffer.length() > 0) { + inputBuffer.deleteCharAt(inputBuffer.length() - 1); + } + } + + // 他のキー入力を処理 + for (int key = GLFW_KEY_SPACE; key <= GLFW_KEY_LAST; key++) { + if (Input.GetKeyDown(key)) { + char typedChar = (char) key; // キーコードから文字を取得 + inputBuffer.append(typedChar); + } + } + + // 入力中のテキストをリアルタイムで表示 + textRenderer.setText(inputBuffer.toString()); + textRenderer.update(); + } + +} diff --git a/GameEngine/src/main/java/gameEngine/entites/editorComponents/EntityView.java b/GameEngine/src/main/java/gameEngine/entites/editorComponents/EntityView.java new file mode 100644 index 0000000..99b2173 --- /dev/null +++ b/GameEngine/src/main/java/gameEngine/entites/editorComponents/EntityView.java @@ -0,0 +1,59 @@ +package gameEngine.entites.editorComponents; + +import gameEngine.entites.EditorEntity; +import gameEngine.views.Sprite; +import org.joml.Vector3f; + +public class EntityView extends Draggable{ + + private Sprite sprite; + private PortView portviewA; + private PortView portviewB; + + public EntityView(EditorEntity parent){ + this.parent = parent; + this.sprite = new Sprite("GameEngine/resources/EntityView.png"); + sprite.updateSpriteDimensions(); + portviewA = new PortView(PortView.PortType.IN, parent); + portviewB = new PortView(PortView.PortType.IN, parent); + } + + @Override + public EditorComponent copy() { + return this; + } + + @Override + public void init(){ + sprite.update(); + sprite.updateSpriteDimensions(); + } + + @Override + public void update() { + sprite.setPosition(parent.transform.position); + sprite.setRotation(parent.transform.rotation); + sprite.setScale(parent.transform.scale); + sprite.update(); + Vector3f pos = new Vector3f(parent.transform.position.x-30,parent.transform.position.y+8,parent.transform.position.z); + portviewA.update(pos, parent.transform.rotation, parent.transform.scale); + portviewA.handleDragging(); +// pos = new Vector3f(parent.transform.position.x-15,parent.transform.position.y+40,parent.transform.position.z); +// portviewB.update(pos, parent.transform.rotation, parent.transform.scale); + } + + @Override + protected boolean isMouseOver(float mouseX, float mouseY) { + return sprite.isMouseOver(mouseX, mouseY); + } + + @Override + protected void draggingAction(float mouseX, float mouseY) { + sprite.setPosition(mouseX - sprite.getDisplayedWidth() / 2, + mouseY - sprite.getDisplayedHeight() / 2); + } + + public PortView getPortView() { + return portviewA; + } +} diff --git a/GameEngine/src/main/java/gameEngine/entites/editorComponents/PortView.java b/GameEngine/src/main/java/gameEngine/entites/editorComponents/PortView.java new file mode 100644 index 0000000..50a72a7 --- /dev/null +++ b/GameEngine/src/main/java/gameEngine/entites/editorComponents/PortView.java @@ -0,0 +1,102 @@ +package gameEngine.entites.editorComponents; + +import gameEngine.entites.EditorEntity; +import gameEngine.scenes.EditorScene; +import gameEngine.views.LineRenderer; +import gameEngine.views.Sprite; +import gameEngine.input.Input; +import gameEngine.input.MouseInput; +import gameEngine.views.Window; +import org.joml.Vector3f; + +import java.util.ArrayList; +import java.util.List; + +public class PortView { + public enum PortType {OUT, IN} + private final PortType portType; + private Sprite sprite; + private Vector3f position = new Vector3f(0,0,0); + private EditorEntity parent; + private List connectedPorts = new ArrayList<>(); + private LineRenderer lineRenderer; + private boolean dragging = false; + + public PortView(PortType portType, EditorEntity parent){ + this.lineRenderer = new LineRenderer("GameEngine/resources/Line.png"); + this.parent = parent; + if(portType == PortType.IN){ + this.sprite = new Sprite("GameEngine/resources/InPort.png"); + } else if(portType == PortType.OUT){ + this.sprite = new Sprite("GameEngine/resources/OutPort.png"); + } + this.portType = portType; + assert sprite != null; + sprite.updateSpriteDimensions(); + } + + public void update(Vector3f pos, Vector3f rot, Vector3f scale){ + sprite.setPosition(pos); + sprite.setRotation(rot); + sprite.setScale(scale); + sprite.update(); + position.set(pos); + } + + public void handleDragging() { + float mouseX = MouseInput.getX(); + float mouseY = MouseInput.getY(); + + if (Input.GetMouseButtonDown(0) && isMouseOver(mouseX, mouseY)) { + EditorScene editorScene = (EditorScene) Window.get().getScene(); + editorScene.connectionManager.handlePortPress(this); + dragging = true; + } + + if (Input.GetMouseButton(0) && dragging) { + lineRenderer.updateLine(sprite.position, new Vector3f(mouseX, mouseY, 0), 3); + } + + if (Input.GetMouseButtonUp(0)) { + dragging = false; + if(isMouseOver(mouseX, mouseY)){ + EditorScene editorScene = (EditorScene) Window.get().getScene(); + editorScene.connectionManager.handlePortRelease(this); + } + } + + } + + protected boolean isMouseOver(float mouseX, float mouseY) { + float width = sprite.getDisplayedWidth(); + float height = sprite.getDisplayedHeight(); + + return mouseX >= position.x && mouseX <= position.x + width && + mouseY >= position.y && mouseY <= position.y + height; + } + + public Vector3f getPosition() { + return position; + } + + public PortType getPortType(){ return portType; } + + public EditorEntity getParent() { + return parent; + } + + public void addConnectedPort(PortView portView) { + if (!connectedPorts.contains(portView)) { + connectedPorts.add(portView); + } + } + + public boolean isConnectedTo(PortView portView) { + return connectedPorts.contains(portView); + } + + public void removeConnectedPort(PortView portView) { + connectedPorts.remove(portView); + } + +} \ No newline at end of file diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/ComponentView.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/ComponentView.java deleted file mode 100644 index 5b574ee..0000000 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/ComponentView.java +++ /dev/null @@ -1,52 +0,0 @@ -package gameEngine.entites.gameComponents; - -import gameEngine.entites.GameObject; -import gameEngine.views.Sprite; -import org.joml.Vector3f; - -public class ComponentView extends Draggable{ - private final Sprite sprite; - public GameObject.Connectiontype connectionType; - private final PortView portview; - - public ComponentView(GameObject parent, GameObject.Connectiontype connectionType){ - this.parent = parent; - this.sprite = new Sprite("GameEngine/resources/ComponentView.png"); - sprite.updateSpriteDimensions(); - portview = new PortView(PortView.PortType.OUT, parent); - this.connectionType = connectionType; - } - - @Override - public void init(){ - sprite.update(); - sprite.updateSpriteDimensions(); - } - - @Override - public void update() { - sprite.setPosition(parent.transform.position); - sprite.setRotation(parent.transform.rotation); - sprite.setScale(parent.transform.scale); - sprite.update(); - Vector3f pos = new Vector3f(parent.transform.position.x+92,parent.transform.position.y,parent.transform.position.z); - portview.update(pos, parent.transform.rotation, parent.transform.scale); - portview.handleDragging(); - } - - @Override - protected boolean isMouseOver(float mouseX, float mouseY) { - return sprite.isMouseOver(mouseX, mouseY); - } - - @Override - protected void draggingAction(float mouseX, float mouseY) { - sprite.setPosition(mouseX - sprite.getDisplayedWidth() / 2, - mouseY - sprite.getDisplayedHeight() / 2); - } - - @Override - public GameComponent copy() { - return this; - } -} diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Connection.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/Connection.java deleted file mode 100644 index c696a75..0000000 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Connection.java +++ /dev/null @@ -1,44 +0,0 @@ -package gameEngine.entites.gameComponents; - -import gameEngine.views.LineRenderer; -import gameEngine.views.Sprite; -import org.joml.Vector3f; - -public class Connection { - private final PortView portA; - private final PortView portB; - private final LineRenderer lineRenderer; - private final Sprite removeButtonSprite; - - public Connection(PortView inPort, PortView outPort) { - this.portA = inPort; - this.portB = outPort; - this.lineRenderer = new LineRenderer("GameEngine/resources/Line.png"); - this.removeButtonSprite = new Sprite("GameEngine/resources/RemoveButton.png"); - } - - public void render() { - Vector3f posA = portA.getPosition(); - Vector3f posB = portB.getPosition(); - - lineRenderer.updateLine(portA.getPosition(), portB.getPosition(), 3); - lineRenderer.render(); - - Vector3f buttonPosition = lineRenderer.calculatePosition(posA, posB); - removeButtonSprite.setPosition(buttonPosition.x, buttonPosition.y - 8); - removeButtonSprite.setScale(1,1,1); - removeButtonSprite.update(); - } - - public boolean isRemoveButtonClicked(float mouseX, float mouseY) { - return removeButtonSprite.isMouseOver(mouseX, mouseY); - } - - public PortView getPortA() { - return portA; - } - - public PortView getPortB() { - return portB; - } -} diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Draggable.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/Draggable.java deleted file mode 100644 index 7eee5cd..0000000 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Draggable.java +++ /dev/null @@ -1,44 +0,0 @@ -package gameEngine.entites.gameComponents; - -import gameEngine.entites.GameObject; -import gameEngine.input.Input; -import gameEngine.input.MouseInput; -import gameEngine.scenes.EditorScene; -import gameEngine.views.Window; - -public abstract class Draggable extends GameComponent { - protected GameObject parent; - protected boolean isDraggable = true; - protected boolean isDragging = false; - - public void setDraggable(boolean draggable) { - this.isDraggable = draggable; - } - - public void handleDragging() { - if (!isDraggable) return; - - float mouseX = MouseInput.getX(); - float mouseY = MouseInput.getY(); - EditorScene scene = (EditorScene) Window.get().getScene(); - - if (scene.getSelectedObject() == null) { - if (Input.GetMouseButtonDown(0) && isMouseOver(mouseX, mouseY)) { - isDragging = true; - scene.setSelectedObject(parent); // エンティティを選択 - } - } - - if (isDragging && Input.GetMouseButton(0)) { - draggingAction(mouseX, mouseY); // ドラッグ中の処理 - } - - if (Input.GetMouseButtonUp(0)) { - isDragging = false; - scene.clearSelectedObject(); // ドラッグ終了時に選択解除 - } - } - - protected abstract boolean isMouseOver(float mouseX, float mouseY); - protected abstract void draggingAction(float mouseX, float mouseY); -} diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/EntityView.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/EntityView.java deleted file mode 100644 index 0d8e8d5..0000000 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/EntityView.java +++ /dev/null @@ -1,60 +0,0 @@ -package gameEngine.entites.gameComponents; - -import gameEngine.entites.Entity; -import gameEngine.entites.GameObject; -import gameEngine.views.Sprite; -import org.joml.Vector3f; - -public class EntityView extends Draggable{ - - private Sprite sprite; - private PortView portviewA; - private PortView portviewB; - - public EntityView(GameObject parent){ - this.parent = parent; - this.sprite = new Sprite("GameEngine/resources/EntityView.png"); - sprite.updateSpriteDimensions(); - portviewA = new PortView(PortView.PortType.IN, parent); - portviewB = new PortView(PortView.PortType.IN, parent); - } - - @Override - public GameComponent copy() { - return this; - } - - @Override - public void init(){ - sprite.update(); - sprite.updateSpriteDimensions(); - } - - @Override - public void update() { - sprite.setPosition(parent.transform.position); - sprite.setRotation(parent.transform.rotation); - sprite.setScale(parent.transform.scale); - sprite.update(); - Vector3f pos = new Vector3f(parent.transform.position.x-30,parent.transform.position.y+8,parent.transform.position.z); - portviewA.update(pos, parent.transform.rotation, parent.transform.scale); - portviewA.handleDragging(); -// pos = new Vector3f(parent.transform.position.x-15,parent.transform.position.y+40,parent.transform.position.z); -// portviewB.update(pos, parent.transform.rotation, parent.transform.scale); - } - - @Override - protected boolean isMouseOver(float mouseX, float mouseY) { - return sprite.isMouseOver(mouseX, mouseY); - } - - @Override - protected void draggingAction(float mouseX, float mouseY) { - sprite.setPosition(mouseX - sprite.getDisplayedWidth() / 2, - mouseY - sprite.getDisplayedHeight() / 2); - } - - public PortView getPortView() { - return portviewA; - } -} diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java index 5b3b2f7..c916fa1 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java @@ -6,8 +6,9 @@ import gameEngine.views.Sprite; import org.joml.Vector3f; -public class Mesh extends Draggable { +public class Mesh extends GameComponent { + private GameObject parent; public enum MeshType { SPRITE, CUBE } @@ -56,17 +57,6 @@ } } - @Override - protected boolean isMouseOver(float mouseX, float mouseY) { - return sprite.isMouseOver(mouseX, mouseY); - } - - @Override - protected void draggingAction(float mouseX, float mouseY) { - sprite.setPosition(mouseX - sprite.getDisplayedWidth() / 2, - mouseY - sprite.getDisplayedHeight() / 2); - } - public void setSprite(String texturePath){ sprite.setTexturePath(texturePath); } diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/PortView.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/PortView.java deleted file mode 100644 index d361fa9..0000000 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/PortView.java +++ /dev/null @@ -1,104 +0,0 @@ -package gameEngine.entites.gameComponents; - -import gameEngine.ConnectionManager; -import gameEngine.entites.Entity; -import gameEngine.entites.GameObject; -import gameEngine.scenes.EditorScene; -import gameEngine.views.LineRenderer; -import gameEngine.views.Sprite; -import gameEngine.input.Input; -import gameEngine.input.MouseInput; -import gameEngine.views.Window; -import org.joml.Vector3f; - -import java.util.ArrayList; -import java.util.List; - -public class PortView { - public enum PortType {OUT, IN} - private final PortType portType; - private Sprite sprite; - private Vector3f position = new Vector3f(0,0,0); - private GameObject parent; - private List connectedPorts = new ArrayList<>(); - private LineRenderer lineRenderer; - private boolean dragging = false; - - public PortView(PortType portType, GameObject parent){ - this.lineRenderer = new LineRenderer("GameEngine/resources/Line.png"); - this.parent = parent; - if(portType == PortType.IN){ - this.sprite = new Sprite("GameEngine/resources/InPort.png"); - } else if(portType == PortType.OUT){ - this.sprite = new Sprite("GameEngine/resources/OutPort.png"); - } - this.portType = portType; - assert sprite != null; - sprite.updateSpriteDimensions(); - } - - public void update(Vector3f pos, Vector3f rot, Vector3f scale){ - sprite.setPosition(pos); - sprite.setRotation(rot); - sprite.setScale(scale); - sprite.update(); - position.set(pos); - } - - public void handleDragging() { - float mouseX = MouseInput.getX(); - float mouseY = MouseInput.getY(); - - if (Input.GetMouseButtonDown(0) && isMouseOver(mouseX, mouseY)) { - EditorScene editorScene = (EditorScene) Window.get().getScene(); - editorScene.connectionManager.handlePortPress(this); - dragging = true; - } - - if (Input.GetMouseButton(0) && dragging) { - lineRenderer.updateLine(sprite.position, new Vector3f(mouseX, mouseY, 0), 3); - } - - if (Input.GetMouseButtonUp(0)) { - dragging = false; - if(isMouseOver(mouseX, mouseY)){ - EditorScene editorScene = (EditorScene) Window.get().getScene(); - editorScene.connectionManager.handlePortRelease(this); - } - } - - } - - protected boolean isMouseOver(float mouseX, float mouseY) { - float width = sprite.getDisplayedWidth(); - float height = sprite.getDisplayedHeight(); - - return mouseX >= position.x && mouseX <= position.x + width && - mouseY >= position.y && mouseY <= position.y + height; - } - - public Vector3f getPosition() { - return position; - } - - public PortType getPortType(){ return portType; } - - public GameObject getParent() { - return parent; - } - - public void addConnectedPort(PortView portView) { - if (!connectedPorts.contains(portView)) { - connectedPorts.add(portView); - } - } - - public boolean isConnectedTo(PortView portView) { - return connectedPorts.contains(portView); - } - - public void removeConnectedPort(PortView portView) { - connectedPorts.remove(portView); - } - -} \ No newline at end of file diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/TextMesh.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/TextMesh.java index f2fdfae..fb0ac60 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/TextMesh.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/TextMesh.java @@ -1,5 +1,6 @@ package gameEngine.entites.gameComponents; +import gameEngine.entites.EditorEntity; import gameEngine.entites.GameObject; import gameEngine.input.Input; import gameEngine.input.MouseInput; @@ -9,11 +10,10 @@ import static org.lwjgl.glfw.GLFW.*; -public class TextMesh extends Draggable{ +public class TextMesh extends GameComponent{ + private GameObject parent; private Text textRenderer; - private boolean isEditingText = false; - private StringBuilder inputBuffer = new StringBuilder(); public TextMesh(GameObject parent, String text, int textSize) { this.parent = parent; @@ -23,10 +23,10 @@ public TextMesh(TextMesh original, GameObject newParent) { this.parent = newParent; this.textRenderer = new Text( - newParent.transform.position.x, - newParent.transform.position.y, - original.textRenderer.text, - original.textRenderer.textSize + newParent.transform.position.x, + newParent.transform.position.y, + original.textRenderer.text, + original.textRenderer.textSize ); } @@ -42,28 +42,13 @@ @Override public void update() { - handleRightClickToggle(); - if (isEditingText) { - handleTextEditing(); - } else { - Vector3f globalPosition = new Vector3f(parent.transform.position).add(localPosition); - textRenderer.setPosition(globalPosition); - Vector3f globalRotation = new Vector3f(parent.transform.rotation).add(localRotation); - textRenderer.setRotation(globalRotation); - Vector3f globalScale = new Vector3f(parent.transform.scale).add(localScale); - textRenderer.setScale(globalScale); - textRenderer.update(); - } - } - - @Override - protected boolean isMouseOver(float mouseX, float mouseY) { - return textRenderer.isMouseOver(mouseX, mouseY); - } - - @Override - protected void draggingAction(float mouseX, float mouseY) { - textRenderer.setPosition(mouseX, mouseY); + Vector3f globalPosition = new Vector3f(parent.transform.position).add(localPosition); + textRenderer.setPosition(globalPosition); + Vector3f globalRotation = new Vector3f(parent.transform.rotation).add(localRotation); + textRenderer.setRotation(globalRotation); + Vector3f globalScale = new Vector3f(parent.transform.scale).add(localScale); + textRenderer.setScale(globalScale); + textRenderer.update(); } public void setText(String newText){ @@ -81,50 +66,4 @@ public int getTextSize(){ return textRenderer.textSize; } - - private void handleRightClickToggle() { - if (Input.GetMouseButtonDown(GLFW_MOUSE_BUTTON_RIGHT) && isMouseOver(MouseInput.getX(), MouseInput.getY())) { - isEditingText = !isEditingText; // 右クリックで編集モードのトグル - if (isEditingText) { - inputBuffer = new StringBuilder(textRenderer.text); // 現在のテキストをバッファにコピー - textRenderer.setColor(Color.GRAY); // 編集中は灰色に変更 - } else { - textRenderer.setColor(textRenderer.color); // 編集終了時に色を戻す - setText(inputBuffer.toString()); - } - } - } - - private void handleTextEditing() { - // エンターキーで編集終了 - if (Input.GetKeyDown(GLFW_KEY_ENTER)) { - isEditingText = false; - setText(inputBuffer.toString()); - textRenderer.setColor(Color.WHITE); // 編集終了時に色を戻す - EditorScene scene = (EditorScene) Window.get().getScene(); - scene.clearSelectedObject(); - inputBuffer.setLength(0); // バッファをクリア - return; - } - - // バックスペースキーで文字削除 - if (Input.GetKeyDown(GLFW_KEY_BACKSPACE)) { - if (inputBuffer.length() > 0) { - inputBuffer.deleteCharAt(inputBuffer.length() - 1); - } - } - - // 他のキー入力を処理 - for (int key = GLFW_KEY_SPACE; key <= GLFW_KEY_LAST; key++) { - if (Input.GetKeyDown(key)) { - char typedChar = (char) key; // キーコードから文字を取得 - inputBuffer.append(typedChar); - } - } - - // 入力中のテキストをリアルタイムで表示 - textRenderer.setText(inputBuffer.toString()); - textRenderer.update(); - } - } diff --git a/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java b/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java index 404f095..17de05b 100644 --- a/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java +++ b/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java @@ -2,12 +2,12 @@ import gameEngine.ConnectionManager; import gameEngine.GameEditor; +import gameEngine.entites.EditorEntity; 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.entites.editorComponents.ComponentView; +import gameEngine.entites.editorComponents.Draggable; +import gameEngine.entites.editorComponents.EditorText; +import gameEngine.entites.editorComponents.EntityView; import gameEngine.views.Window; import org.joml.Vector3f; @@ -18,8 +18,8 @@ public class EditorScene extends Scene { private static GameEditor gameEditor; - public HashMap editorEntities = new HashMap<>(); - private GameObject selectedObject = null; + public HashMap editorEntities = new HashMap<>(); + private EditorEntity selectedEntity = null; public ConnectionManager connectionManager = new ConnectionManager(); public EditorScene(float windowWidth, float windowHeight){ @@ -35,10 +35,8 @@ changeScene(1, dt); //Gameシーンへの以降処理 connectionManager.update(); - for (Entity entity : editorEntities.values()) { - if (entity instanceof GameObject gameObject) { - gameObject.updateComponents(); - } + for (EditorEntity editorEntity : editorEntities.values()) { + editorEntity.updateComponents(); } gameEditor.update(); } @@ -46,19 +44,19 @@ public Entity getEditorEntity(String eid) { return editorEntities.get(eid); } - public void addEditorEntity(String eid, Entity entity) { + public void addEditorEntity(String eid, EditorEntity entity) { editorEntities.put(eid, entity); } public void removeEditorEntity(String eid) { editorEntities.remove(eid); } - private GameObject createGameObject(){ + private EditorEntity createEditorEntity(){ int entitiesLength = editorEntities.size(); String newId = Integer.toString(entitiesLength); - GameObject gameObject = new GameObject(newId); - addEditorEntity(newId, gameObject); - return gameObject; + EditorEntity editorEntity = new EditorEntity(newId); + addEditorEntity(newId, editorEntity); + return editorEntity; } public void addNewEntity() { @@ -66,11 +64,11 @@ } private void addEntityView(){ - GameObject object = createGameObject(); + EditorEntity object = createEditorEntity(); 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)); + object.addEditorComponent(new EntityView(object)); + object.addEditorComponent(new EditorText(object, "Entity", 16)); + object.getEditorComponent(EditorText.class).setLocalPosition(new Vector3f(0,-20,0)); } public void addNewMeshComponent() { @@ -78,11 +76,11 @@ } private void addMeshComponentView(){ - GameObject object = createGameObject(); + EditorEntity object = createEditorEntity(); object.transform.setPosition((float) Window.get().width / 2 ,(float) Window.get().height /2, 0); - object.addComponent(new ComponentView(object, GameObject.Connectiontype.Mesh)); - object.addComponent(new TextMesh(object, "Mesh", 14)); - object.getComponent(TextMesh.class).setLocalPosition(new Vector3f(10,2,0)); + object.addEditorComponent(new ComponentView(object, EditorEntity.Connectiontype.Mesh)); + object.addEditorComponent(new EditorText(object, "Mesh", 14)); + object.getEditorComponent(EditorText.class).setLocalPosition(new Vector3f(10,2,0)); } public void addNewMoveImageComponent() { @@ -90,45 +88,42 @@ } private void addMoveImageComponentView(){ - GameObject object = createGameObject(); + EditorEntity object = createEditorEntity(); object.transform.setPosition((float) Window.get().width / 2 ,(float) Window.get().height /2, 0); - object.addComponent(new ComponentView(object, GameObject.Connectiontype.MoveImage)); - object.addComponent(new TextMesh(object, "MoveImage", 14)); - object.getComponent(TextMesh.class).setLocalPosition(new Vector3f(10,2,0)); + object.addEditorComponent(new ComponentView(object, EditorEntity.Connectiontype.MoveImage)); + object.addEditorComponent(new EditorText(object, "MoveImage", 14)); + object.getEditorComponent(EditorText.class).setLocalPosition(new Vector3f(10,2,0)); } + ///---------------------------------------------------------------- /// 選択、ドラッグ処理 ///---------------------------------------------------------------- - public GameObject getSelectedObject() { - return selectedObject; + public EditorEntity getSelectedEntity() { + return selectedEntity; } - public void setSelectedObject(GameObject gameObject) { - selectedObject = gameObject; - System.out.println("Selected Entity: " + selectedObject); + public void setSelectedEntity(EditorEntity editorEntity) { + selectedEntity = editorEntity; + System.out.println("Selected Entity: " + selectedEntity); } public void clearSelectedObject() { - selectedObject = null; + selectedEntity = null; } public void updateDraggable() { - if (selectedObject != null) { - if (selectedObject.getComponent(Draggable.class) != null) { - selectedObject.getComponent(Draggable.class).handleDragging(); + if (selectedEntity != null) { + if (selectedEntity.getEditorComponent(Draggable.class) != null) { + selectedEntity.getEditorComponent(Draggable.class).handleDragging(); } } else { - for (Entity entity : editorEntities.values()) { - if (entity instanceof GameObject gameObject) { - if (gameObject.getComponent(Draggable.class) != null) { - gameObject.getComponent(Draggable.class).handleDragging(); - } + for (EditorEntity entity : editorEntities.values()) { + if (entity.getEditorComponent(Draggable.class) != null) { + entity.getEditorComponent(Draggable.class).handleDragging(); } } } } - - } diff --git a/GameEngine/src/main/java/gameEngine/scenes/GameScene.java b/GameEngine/src/main/java/gameEngine/scenes/GameScene.java index 10a7169..099b0e5 100644 --- a/GameEngine/src/main/java/gameEngine/scenes/GameScene.java +++ b/GameEngine/src/main/java/gameEngine/scenes/GameScene.java @@ -1,11 +1,11 @@ package gameEngine.scenes; +import gameEngine.entites.EditorEntity; import gameEngine.entites.Entity; import gameEngine.entites.GameObject; +import gameEngine.entites.editorComponents.EntityView; import gameEngine.entites.gameComponents.*; -import gameEngine.input.Input; -import java.awt.event.KeyEvent; import java.util.HashMap; import static org.lwjgl.opengl.GL11.glClearColor; @@ -17,16 +17,15 @@ glClearColor(1, 1, 1, 0); } - public GameScene(HashMap editorEntities) { - for(Entity EditorEntity : editorEntities.values()){ - GameObject editorObject = (GameObject) EditorEntity; - if(editorObject.getComponent(EntityView.class) != null) addNewObject(editorObject); + public GameScene(HashMap editorEntities) { + for(EditorEntity editorEntity : editorEntities.values()){ + if(editorEntity.getEditorComponent(EntityView.class) != null) addNewObject(editorEntity); } System.out.println("Active Game scene"); glClearColor(1, 1, 1, 0); } - public void addNewObject(GameObject editorObject) { + public void addNewObject(EditorEntity editorObject) { enqueueTask(() -> addNewGameObject(editorObject)); } @@ -39,15 +38,15 @@ return gameObject; } - private void addNewGameObject(GameObject editorObject) { + private void addNewGameObject(EditorEntity editorEntity) { GameObject object = createGameObject(); - object.transform.setPosition(editorObject.transform.position.x,editorObject.transform.position.y,0); + object.transform.setPosition(editorEntity.transform.position.x, editorEntity.transform.position.y,0); - for(GameObject.Connectiontype connectionType: editorObject.ComponentConnections) { - if(connectionType == GameObject.Connectiontype.Mesh){ + for(EditorEntity.Connectiontype connectionType: editorEntity.ComponentConnections) { + if(connectionType == EditorEntity.Connectiontype.Mesh){ object.addComponent(new Mesh(object, Mesh.MeshType.SPRITE, "GameEngine/resources/0.png")); } - if(connectionType == GameObject.Connectiontype.MoveImage){ + if(connectionType == EditorEntity.Connectiontype.MoveImage){ object.addComponent(new MoveImage(object)); } } @@ -58,8 +57,6 @@ changeScene(0, dt); //Editorシーンへの以降処理 for (Entity entity : entities.values()) { if (entity instanceof GameObject gameObject) { - if(gameObject.getComponent(EntityView.class) != null) continue; - if(gameObject.getComponent(ComponentView.class) != null) continue; if(gameObject.getComponent(TextMesh.class) != null) continue; gameObject.updateComponents(); }