diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/CopyEntity.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/CopyEntity.java new file mode 100644 index 0000000..b91144b --- /dev/null +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/CopyEntity.java @@ -0,0 +1,21 @@ +package gameEngine.entites.gameComponents; + +import gameEngine.entites.Entity; +import gameEngine.entites.GameObject; +import gameEngine.input.Input; +import gameEngine.views.Window; + +import static org.lwjgl.glfw.GLFW.GLFW_KEY_G; + +public class CopyEntity extends GameComponent{ + private Entity entity; + public CopyEntity(Entity entity){ + this.entity = entity; + } + + public void update() { + if(Input.GetKeyDown(GLFW_KEY_G)){ + Window.currentScene.Instantiate((GameObject) entity); + } + } +} diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java index c0246fa..4864af4 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java @@ -27,6 +27,16 @@ } } + public Mesh(Mesh original, Entity newParent) { + this.type = original.type; + this.texture = original.texture; // Textureをそのまま参照 + this.parent = newParent; // 新しい親オブジェクトに設定 + } + + public Mesh copy(){ + return this; + } + @Override public void init() { if (type == MeshType.SPRITE) { diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/MoveImage.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/MoveImage.java index 4df88b0..709af28 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/MoveImage.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/MoveImage.java @@ -2,6 +2,7 @@ import gameEngine.entites.Entity; import gameEngine.entites.GameObject; import gameEngine.input.*; +import gameEngine.views.Window; import static org.lwjgl.glfw.GLFW.*; import static org.lwjgl.opengl.GL11.*; @@ -78,5 +79,9 @@ if (rotation >= 360) rotation -= 360; entity.transform.setRotation(entity.transform.rotation.x, entity.transform.rotation.y, rotation); // 右回転 } + + if(Input.GetKeyDown(GLFW_KEY_G)){ + Window.currentScene.Instantiate((GameObject) entity); + } } } diff --git a/GameEngine/src/main/java/gameEngine/scenes/Scene.java b/GameEngine/src/main/java/gameEngine/scenes/Scene.java index 59d3d74..b3c0a11 100644 --- a/GameEngine/src/main/java/gameEngine/scenes/Scene.java +++ b/GameEngine/src/main/java/gameEngine/scenes/Scene.java @@ -5,7 +5,7 @@ import gameEngine.entites.GameObject; import gameEngine.entites.gameComponents.GameComponent; import gameEngine.entites.gameComponents.Mesh; -import gameEngine.entites.gameComponents.MoveImage; +import gameEngine.geometry.Transform; import gameEngine.input.Input; import gameEngine.views.Color; import gameEngine.views.Window; @@ -21,7 +21,7 @@ private Camera camera; public HashMap entities = new HashMap<>(); - private Queue taskQueue = new LinkedList<>(); + private final Queue taskQueue = new LinkedList<>(); private boolean changingScene = false; private float timeToChangeScene = 2.0f; @@ -82,6 +82,27 @@ } } + public void Instantiate(GameObject original) + { + enqueueTask(() -> { + String newId = Integer.toString(entities.size()); + GameObject newGameObject = new GameObject(newId); + + newGameObject.setName(original.getName() + "_copy"); + newGameObject.transform = new Transform(original.transform); + + for (GameComponent gameComponent : original.gameComponents) { + if (gameComponent instanceof Mesh) { + newGameObject.addComponent(new Mesh(((Mesh) gameComponent).copy(), newGameObject)); + break; + } + } + + addEntity(newId, newGameObject); + }); + } + + //シーン切り替え時の演出 void changeScene(int scene, float dt){ if(!changingScene && Input.GetKeyDown(KeyEvent.VK_SPACE)){ changingScene = true; diff --git a/GameEngine/src/main/java/gameEngine/views/Window.java b/GameEngine/src/main/java/gameEngine/views/Window.java index 545ddd8..32c82d1 100644 --- a/GameEngine/src/main/java/gameEngine/views/Window.java +++ b/GameEngine/src/main/java/gameEngine/views/Window.java @@ -22,7 +22,7 @@ public class Window { private static Window window; - private static Scene currentScene; + public static Scene currentScene; public int width; public int height; private String title;