package gameEngine.scenes;
import gameEngine.Time;
import gameEngine.entites.Camera;
import gameEngine.entites.EditorEntity;
import gameEngine.entites.Entity;
import gameEngine.entites.GameObject;
import gameEngine.entites.editorComponents.CameraView;
import gameEngine.entites.editorComponents.ComponentView;
import gameEngine.entites.editorComponents.EntityView;
import gameEngine.entites.gameComponents.*;
import org.joml.Vector3f;
import java.util.HashMap;
import java.util.Objects;
import static org.lwjgl.opengl.GL11.glClearColor;
public class GameScene extends Scene {
private Camera gameCamera;
public GameScene(){
this(null);
}
public GameScene(HashMap<String, EditorEntity> editorEntities) {
gameCamera = new Camera("001", Camera.ProjectionType.PERSPECTIVE);
setCamera(gameCamera);
if(editorEntities != null){
for(EditorEntity editorEntity : editorEntities.values()){
if(editorEntity.getEditorComponent(EntityView.class) != null) addNewObject(editorEntity);
if(editorEntity.getEditorComponent(CameraView.class) != null) gameCamera.transform.setPosition(editorEntity.transform.position);
}
}
System.out.println("Active Game scene");
glClearColor(1, 1, 1, 0);
Time.reset();
}
public void addNewObject(EditorEntity editorObject) {
enqueueTask(() -> addNewGameObject(editorObject));
}
private GameObject createGameObject(){
int entitiesLength = entities.size();
String newId = Integer.toString(entitiesLength);
GameObject gameObject = new GameObject(newId);
addEntity(newId, gameObject);
return gameObject;
}
private void addNewGameObject(EditorEntity editorEntity) {
GameObject object = createGameObject();
object.transform.setPosition(editorEntity.transform.position.x, editorEntity.transform.position.y,0);
for(EditorEntity.Connectiontype connectionType: editorEntity.ComponentConnections) {
if(connectionType == EditorEntity.Connectiontype.Mesh){
for(ComponentView componentView: editorEntity.getEditorComponent(EntityView.class).getConnectedComponentViews()){
if(componentView.meshSprite != null) {
if(Objects.equals(componentView.getSpritePath(), null)) continue;
object.addComponent(new Mesh(object, Mesh.MeshType.SPRITE, componentView.getSpritePath()));
break;
}
}
object.addComponent(new Collider(object, false)); //コライダー(仮)
}
if(connectionType == EditorEntity.Connectiontype.MoveImage){
object.addComponent(new MoveImage(object));
}
if(connectionType == EditorEntity.Connectiontype.Move){
object.addComponent(new Move(object));
}
}
}
@Override
public void update(float dt) {
changeScene(0, dt); //Editorシーンへの以降処理
reflectionCamera();
for (Entity entity : entities.values()) {
if (entity instanceof GameObject) {
GameObject gameObject = (GameObject) entity;
if(gameObject.getComponent(TextMesh.class) != null) continue;
gameObject.updateComponents();
}
}
}
//カメラの反映を行う(座標調整等)
public void reflectionCamera(){
Vector3f cameraPosition = gameCamera.getPosition();
for (Entity entity : entities.values()) {
entity.screenTransform.setPosition(
entity.transform.position.x - cameraPosition.x,
entity.transform.position.y - cameraPosition.y,
entity.transform.position.z
);
}
}
}