diff --git a/GameEngine/src/main/java/gameEngine/entites/Entity.java b/GameEngine/src/main/java/gameEngine/entites/Entity.java index 093dcba..4318184 100644 --- a/GameEngine/src/main/java/gameEngine/entites/Entity.java +++ b/GameEngine/src/main/java/gameEngine/entites/Entity.java @@ -8,8 +8,10 @@ public class Entity { - private String entityId; // 作成時に割り当て + private String entityId; public Transform transform = new Transform(); + public Transform screenTransform = new Transform(); + public boolean active = true; public String name = "Entity"; diff --git a/GameEngine/src/main/java/gameEngine/entites/editorComponents/ComponentView.java b/GameEngine/src/main/java/gameEngine/entites/editorComponents/ComponentView.java index cd78e00..0898a64 100644 --- a/GameEngine/src/main/java/gameEngine/entites/editorComponents/ComponentView.java +++ b/GameEngine/src/main/java/gameEngine/entites/editorComponents/ComponentView.java @@ -2,14 +2,18 @@ import gameEngine.ResourceManager; import gameEngine.entites.EditorEntity; +import gameEngine.geometry.Transform; import gameEngine.input.Input; import gameEngine.input.MouseInput; +import gameEngine.scenes.EditorScene; import gameEngine.views.Sprite; +import gameEngine.views.Text; import gameEngine.views.Window; import org.joml.Vector3f; public class ComponentView extends Draggable{ private final Sprite sprite; + private final Text text; public EditorEntity.Connectiontype connectionType; private final PortView portview; @@ -18,16 +22,17 @@ public Sprite meshSprite; ResourceManager resourceManager; - public ComponentView(EditorEntity parent, EditorEntity.Connectiontype connectionType){ + public ComponentView(EditorEntity parent, EditorEntity.Connectiontype connectionType, String text){ this.parent = parent; this.sprite = new Sprite(Window.resourcePath + "ComponentView.png"); sprite.updateSpriteDimensions(); + this.text = new Text(parent.screenTransform.position.x, parent.screenTransform.position.y, text, 14); portview = new PortView(PortView.PortType.OUT, parent); this.connectionType = connectionType; } - public ComponentView(EditorEntity parent, EditorEntity.Connectiontype connectionType, ResourceManager resourceManager){ - this(parent, connectionType); + public ComponentView(EditorEntity parent, EditorEntity.Connectiontype connectionType, ResourceManager resourceManager, String text){ + this(parent, connectionType, text); this.resourceManager = resourceManager; meshSprite = new Sprite(resourceManager.getPath(meshId)); } @@ -40,27 +45,44 @@ @Override public void update() { - sprite.setPosition(parent.transform.position); - sprite.setRotation(parent.transform.rotation); - sprite.setScale(parent.transform.scale); - sprite.update(); + Transform transform = parent.transform; + Transform screenTransform = parent.screenTransform; - if(meshSprite != null){ - meshSprite.setPosition(new Vector3f(parent.transform.position.x, parent.transform.position.y+30, parent.transform.position.z)); - meshSprite.setRotation(parent.transform.rotation); - meshSprite.setScale(parent.transform.scale); - meshSprite.update(); + if(Window.get().getScene() instanceof EditorScene) { + Vector3f cameraPosition = Window.get().getScene().getCamera().getPosition(); + Vector3f actualPosition = new Vector3f(screenTransform.position).sub(cameraPosition); - float mouseX = MouseInput.getX(); - float mouseY = MouseInput.getY(); - if (Input.GetMouseButtonDown(0) && meshSprite.isMouseOver(mouseX, mouseY)) { - changeMeshSprite(); + sprite.setPosition(actualPosition); + sprite.setRotation(transform.rotation); + sprite.setScale(transform.scale); + sprite.update(); + + text.setPosition(new Vector3f(0,-16,0).add(actualPosition)); + text.setRotation(transform.rotation); + text.setScale(transform.scale); + text.update(); + + Vector3f adjustedPos = new Vector3f(actualPosition.x +92, actualPosition.y, actualPosition.z); + portview.update(adjustedPos, transform.rotation, transform.scale); + portview.handleDragging(); + + if(meshSprite != null){ + meshSprite.setPosition(new Vector3f(actualPosition.x, actualPosition.y+30, actualPosition.z)); + meshSprite.setRotation(transform.rotation); + meshSprite.setScale(transform.scale); + meshSprite.update(); + + float mouseX = MouseInput.getX(); + float mouseY = MouseInput.getY(); + if (Input.GetMouseButtonDown(0) && meshSprite.isMouseOver(mouseX, mouseY)) { + changeMeshSprite(); + } } } - 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(); + + + } private void changeMeshSprite() { @@ -79,9 +101,42 @@ } @Override + protected void leftDragStartAction(float mouseX, float mouseY) { + Vector3f cameraPosition = Window.get().getScene().getCamera().getPosition(); + + float worldMouseX = mouseX + cameraPosition.x; + float worldMouseY = mouseY + cameraPosition.y; + + dragOffsetX = worldMouseX - parent.transform.position.x; + dragOffsetY = worldMouseY - parent.transform.position.y; + } + + @Override protected void leftDraggingAction(float mouseX, float mouseY) { - sprite.setPosition(mouseX - sprite.getDisplayedWidth() / 2, - mouseY - sprite.getDisplayedHeight() / 2); + Vector3f cameraPosition = Window.get().getScene().getCamera().getPosition(); + + float worldMouseX = mouseX + cameraPosition.x; + float worldMouseY = mouseY + cameraPosition.y; + + float targetX = worldMouseX - dragOffsetX; + float targetY = worldMouseY - dragOffsetY; + + parent.transform.setPosition( + targetX, + targetY, + parent.transform.position.z + ); + + parent.screenTransform.setPosition( + parent.transform.position.x - cameraPosition.x, + parent.transform.position.y - cameraPosition.y, + parent.transform.position.z - - cameraPosition.z + ); + } + + @Override + protected void rightDragStartAction(float mouseX, float mouseY) { + } @Override diff --git a/GameEngine/src/main/java/gameEngine/entites/editorComponents/Draggable.java b/GameEngine/src/main/java/gameEngine/entites/editorComponents/Draggable.java index 0ab2d51..1095256 100644 --- a/GameEngine/src/main/java/gameEngine/entites/editorComponents/Draggable.java +++ b/GameEngine/src/main/java/gameEngine/entites/editorComponents/Draggable.java @@ -11,6 +11,8 @@ protected boolean isDraggable = true; protected boolean isLeftDragging = false; protected boolean isRightDragging = false; + protected float dragOffsetX = 0.0f; + protected float dragOffsetY = 0.0f; public void setDraggable(boolean draggable) { this.isDraggable = draggable; @@ -28,33 +30,38 @@ isLeftDragging = true; scene.setSelectedEntity(parent); scene.setClickedEntity(parent); + leftDragStartAction(mouseX, mouseY); // ドラッグ開始時の処理 } if (Input.GetMouseButtonDown(1) && isMouseOver(mouseX, mouseY)) { isRightDragging = true; scene.setSelectedEntity(parent); scene.setClickedEntity(parent); + rightDragStartAction(mouseX, mouseY); } } if (isLeftDragging && Input.GetMouseButton(0)) { - leftDraggingAction(mouseX, mouseY); // ドラッグ中の処理 + leftDraggingAction(mouseX, mouseY); // ドラッグ中の処理 } if (isRightDragging && Input.GetMouseButton(1)) { - rightDraggingAction(mouseX, mouseY); // ドラッグ中の処理 + rightDraggingAction(mouseX, mouseY); // ドラッグ中の処理 } if (Input.GetMouseButtonUp(0)) { isLeftDragging = false; - scene.clearSelectedObject(); // ドラッグ終了時に選択解除 + scene.clearSelectedObject(); } if (Input.GetMouseButtonUp(1)) { isRightDragging = false; - scene.clearSelectedObject(); // ドラッグ終了時に選択解除 + scene.clearSelectedObject(); } } protected abstract boolean isMouseOver(float mouseX, float mouseY); + protected abstract void leftDragStartAction(float mouseX, float mouseY); protected abstract void leftDraggingAction(float mouseX, float mouseY); + protected abstract void rightDragStartAction(float mouseX, float mouseY); protected abstract void rightDraggingAction(float mouseX, float mouseY); + } diff --git a/GameEngine/src/main/java/gameEngine/entites/editorComponents/EditorText.java b/GameEngine/src/main/java/gameEngine/entites/editorComponents/EditorText.java deleted file mode 100644 index 5ffee1a..0000000 --- a/GameEngine/src/main/java/gameEngine/entites/editorComponents/EditorText.java +++ /dev/null @@ -1,135 +0,0 @@ -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 leftDraggingAction(float mouseX, float mouseY) { - textRenderer.setPosition(mouseX, mouseY); - } - - @Override - protected void rightDraggingAction(float mouseX, float 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 index 53e449a..8281c91 100644 --- a/GameEngine/src/main/java/gameEngine/entites/editorComponents/EntityView.java +++ b/GameEngine/src/main/java/gameEngine/entites/editorComponents/EntityView.java @@ -2,7 +2,9 @@ import gameEngine.entites.EditorEntity; import gameEngine.geometry.Transform; +import gameEngine.scenes.EditorScene; import gameEngine.views.Sprite; +import gameEngine.views.Text; import gameEngine.views.Window; import org.joml.Vector3f; @@ -12,24 +14,19 @@ public class EntityView extends Draggable{ private Sprite sprite; + private Text text; private PortView portviewA; - private PortView portviewB; - public EntityView(EditorEntity parent){ + public EntityView(EditorEntity parent) { this.parent = parent; this.sprite = new Sprite(Window.resourcePath + "EntityView.png"); + this.text = new Text(parent.screenTransform.position.x, parent.screenTransform.position.y, "Entity", 14); 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(){ + public void init() { sprite.update(); sprite.updateSpriteDimensions(); } @@ -37,39 +34,125 @@ @Override public void update() { Transform transform = parent.transform; - sprite.setPosition(transform.position); - sprite.setRotation(transform.rotation); - sprite.setScale(transform.scale); - sprite.update(); - Vector3f pos = new Vector3f(transform.position.x-30,transform.position.y+8, transform.position.z); - portviewA.update(pos, transform.rotation, transform.scale); - portviewA.handleDragging(); + Transform screenTransform = parent.screenTransform; + + if(Window.get().getScene() instanceof EditorScene) { + Vector3f cameraPosition = Window.get().getScene().getCamera().getPosition(); + Vector3f actualPosition = new Vector3f(screenTransform.position).sub(cameraPosition); + + sprite.setPosition(actualPosition); + sprite.setRotation(transform.rotation); + sprite.setScale(transform.scale); + sprite.update(); + + text.setPosition(new Vector3f(0,-16,0).add(actualPosition)); + text.setRotation(transform.rotation); + text.setScale(transform.scale); + text.update(); + + Vector3f adjustedPos = new Vector3f(actualPosition.x - 30, actualPosition.y + 8, actualPosition.z); + portviewA.update(adjustedPos, transform.rotation, transform.scale); + portviewA.handleDragging(); + } + } @Override + public EditorComponent copy() { + return this; + } + + + @Override protected boolean isMouseOver(float mouseX, float mouseY) { return sprite.isMouseOver(mouseX, mouseY); } @Override + protected void leftDragStartAction(float mouseX, float mouseY) { + Vector3f cameraPosition = Window.get().getScene().getCamera().getPosition(); + + float worldMouseX = mouseX + cameraPosition.x; + float worldMouseY = mouseY + cameraPosition.y; + + dragOffsetX = worldMouseX - parent.transform.position.x; + dragOffsetY = worldMouseY - parent.transform.position.y; + } + + @Override protected void leftDraggingAction(float mouseX, float mouseY) { - sprite.setPosition(mouseX - sprite.getDisplayedWidth() / 2, - mouseY - sprite.getDisplayedHeight() / 2); + Vector3f cameraPosition = Window.get().getScene().getCamera().getPosition(); + + float worldMouseX = mouseX + cameraPosition.x; + float worldMouseY = mouseY + cameraPosition.y; + + float targetX = worldMouseX - dragOffsetX; + float targetY = worldMouseY - dragOffsetY; + + parent.transform.setPosition( + targetX, + targetY, + parent.transform.position.z + ); + + parent.screenTransform.setPosition( + parent.transform.position.x - cameraPosition.x, + parent.transform.position.y - cameraPosition.y, + parent.transform.position.z - - cameraPosition.z + ); + } + + @Override + protected void rightDragStartAction(float mouseX, float mouseY) { + Vector3f cameraPosition = Window.get().getScene().getCamera().getPosition(); + + float worldMouseX = mouseX + cameraPosition.x; + float worldMouseY = mouseY + cameraPosition.y; + + dragOffsetX = worldMouseX - parent.transform.position.x; + dragOffsetY = worldMouseY - parent.transform.position.y; } @Override protected void rightDraggingAction(float mouseX, float mouseY) { - float deltaX = mouseX - sprite.getDisplayedWidth() / 2 - sprite.position.x; - float deltaY = mouseY - sprite.getDisplayedHeight() / 2 - sprite.position.y; - sprite.setPosition(mouseX - sprite.getDisplayedWidth() / 2, - mouseY - sprite.getDisplayedHeight() / 2); + Vector3f cameraPosition = Window.get().getScene().getCamera().getPosition(); + + float worldMouseX = mouseX + cameraPosition.x; + float worldMouseY = mouseY + cameraPosition.y; + + float targetX = worldMouseX - dragOffsetX; + float targetY = worldMouseY - dragOffsetY; + + float deltaX = targetX - parent.transform.position.x; + float deltaY = targetY - parent.transform.position.y; + + parent.transform.setPosition( + targetX, + targetY, + parent.transform.position.z + ); + + parent.screenTransform.setPosition( + parent.transform.position.x - cameraPosition.x, + parent.transform.position.y - cameraPosition.y, + parent.transform.position.z - cameraPosition.z + ); List connectedComponents = getConnectedComponentViews(); for (ComponentView component : connectedComponents) { - EditorEntity componentParent = component.parent; // ComponentViewのSprite取得 - componentParent.transform.setPosition(componentParent.transform.position.x + deltaX, - componentParent.transform.position.y + deltaY, componentParent.transform.position.z); + EditorEntity componentParent = component.parent; + componentParent.transform.setPosition( + componentParent.transform.position.x + deltaX, + componentParent.transform.position.y + deltaY, + componentParent.transform.position.z + ); + + componentParent.screenTransform.setPosition( + componentParent.transform.position.x - cameraPosition.x, + componentParent.transform.position.y - cameraPosition.y, + componentParent.transform.position.z - cameraPosition.z + ); } } @@ -93,4 +176,4 @@ } return connectedComponentViews; } -} +} \ No newline at end of file diff --git a/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java b/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java index 981492b..598b778 100644 --- a/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java +++ b/GameEngine/src/main/java/gameEngine/scenes/EditorScene.java @@ -9,7 +9,6 @@ import gameEngine.entites.Entity; import gameEngine.entites.editorComponents.ComponentView; import gameEngine.entites.editorComponents.Draggable; -import gameEngine.entites.editorComponents.EditorText; import gameEngine.entites.editorComponents.EntityView; import gameEngine.geometry.Transform; import gameEngine.input.Input; @@ -36,6 +35,7 @@ gameEditor = new GameEditor(this, windowWidth, windowHeight); gameEditor.setScene(this); this.editorCamera = new Camera("001", Camera.ProjectionType.PERSPECTIVE); + this.setCamera(editorCamera); glClearColor(1, 1, 1, 0); resourceManager.addPath(Window.resourcePath + "empty.png"); resourceManager.addPath(Window.resourcePath + "enemy1.png"); @@ -81,10 +81,8 @@ private void addEntityView(){ EditorEntity object = createEditorEntity(); - object.transform.setPosition((float) Window.get().width / 2 ,(float) Window.get().height /2, 0); + object.transform.setPosition(0 ,0, 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() { @@ -93,10 +91,8 @@ private void addMeshComponentView(){ EditorEntity object = createEditorEntity(); - object.transform.setPosition((float) Window.get().width / 2 ,(float) Window.get().height /2, 0); - object.addEditorComponent(new ComponentView(object, EditorEntity.Connectiontype.Mesh, resourceManager)); - object.addEditorComponent(new EditorText(object, "Mesh", 14)); - object.getEditorComponent(EditorText.class).setLocalPosition(new Vector3f(10,2,0)); + object.transform.setPosition(0 ,0, 0); + object.addEditorComponent(new ComponentView(object, EditorEntity.Connectiontype.Mesh, resourceManager,"Mesh")); } public void addNewMoveImageComponent() { @@ -105,18 +101,14 @@ private void addMoveImageComponentView(){ EditorEntity object = createEditorEntity(); - object.transform.setPosition((float) Window.get().width / 2 ,(float) Window.get().height /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)); + object.transform.setPosition(0 ,0, 0); + object.addEditorComponent(new ComponentView(object, EditorEntity.Connectiontype.MoveImage, "MoveImage")); } ///---------------------------------------------------------------- /// Editorのカメラ ///---------------------------------------------------------------- - - private void handleCameraMovement() { Vector3f velocity = new Vector3f(0, 0, 0); float speed = 200.0f; @@ -134,16 +126,19 @@ velocity.x += speed * Time.deltaTime; } - editorCamera.move(velocity.x, velocity.y, velocity.z); + // カメラを移動 + editorCamera.move(velocity.x, velocity.y, 0); + + // 各オブジェクトのscreenTransformをカメラ位置に応じて補正 + Vector3f cameraPosition = editorCamera.getPosition(); for (EditorEntity editorEntity : editorEntities.values()) { - editorEntity.transform.setPosition( - editorEntity.transform.position.x - velocity.x, - editorEntity.transform.position.y - velocity.y, - editorEntity.transform.position.z - velocity.z + editorEntity.screenTransform.setPosition( + editorEntity.transform.position.x - cameraPosition.x, + editorEntity.transform.position.y - cameraPosition.y, + editorEntity.transform.position.z ); } } - ///---------------------------------------------------------------- /// 選択、ドラッグ処理 ///----------------------------------------------------------------