Newer
Older
AlgebraicDataflowArchitectureModel / GameEngine / src / main / java / gameEngine / GameEditor.java
package gameEngine;

import gameEngine.scenes.EditorScene;
import gameEngine.views.*;
import gameEngine.scenes.Scene;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class GameEditor {
    private EditorScene scene;
    private float windowWidth, windowHeight;
    private final String frameImagePath = Window.resourcePath + "EditorFrame.png";

    private List<IUpdatable> updatableviews = new ArrayList<>();

    private Sprite[] EditorFrameSprite = new Sprite[4];

    private Button playButton;
    private Text playButtonText;

    private Button createMeshComponentViewButton;
    private Text createMeshComponentViewButtonText;

    private Button createMoveImageComponentViewButton;
    private Text createMoveImageComponentViewButtonText;

    private Button createEntityViewButton;
    private Text createEntityViewButtonText;

    public GameEditor(Scene scene, float windowWidth, float windowHeight) {
        this.scene = (EditorScene) scene;
        this.windowWidth = windowWidth;
        this.windowHeight = windowHeight;
        initializeEditorComponents();
    }

    private void initializeEditorComponents() {
        createFrame();

        playButton = new Button(windowWidth/ 2 -16 , 3, 1, 0.4f);
        playButtonText = new Text(windowWidth/ 2 - 11.25f, 1, "Play", 24);

        createMeshComponentViewButton = new Button(20, 33, 3.2f, 0.5f);
        createMeshComponentViewButtonText = new Text(20 +5.25f, 30.4f, "Add Mesh", 24);

        createMoveImageComponentViewButton = new Button(20, 73, 3.2f, 0.5f);
        createMoveImageComponentViewButtonText = new Text(20 +5.25f, 70.4f, "Add MoveImage", 24);

        createEntityViewButton = new Button(240, 33, 3.2f, 0.5f);
        createEntityViewButtonText = new Text(240 +5.25f, 30.4f, "Add Entity", 24);

        setButtonListeners();
        setInspector();
    }

    private void registerUpdatable(IUpdatable... components) {
        Collections.addAll(updatableviews, components);
    }

    private void setInspector() {
        String[] labels = {"Position", "Rotation", "Scale"};
        String[] axes = {"x", "y", "z"};
        float startX = 900;
        float startY = 40;
        float fieldWidth = 70;
        float fieldHeight = 22;
        float spacingX = 100;
        float spacingY = 40;
        float labelOffsetX = -100;
        float labelOffsetY = 5;

        for (int i = 0; i < labels.length; i++) {
            float labelX = startX + labelOffsetX;
            float labelY = startY + i * spacingY + labelOffsetY;

            Text labelText = new Text(labelX, labelY-6, labels[i] + ":", 18);
            updatableviews.add(labelText);

            for (int j = 0; j < axes.length; j++) {
                float fieldX = startX + j * spacingX;
                float fieldY = startY + i * spacingY;

                Text axisText = new Text(fieldX - 20, fieldY, axes[j] + ":", 18);
                InputField field = new InputField(fieldX, fieldY, fieldWidth, fieldHeight, "0", 18);

                updatableviews.add(axisText);
                updatableviews.add(field);
            }
        }
    }

    private void setButtonListeners() {
        playButton.clearListeners();
        playButton.addListener(scene::changeSceneStart);

        createMeshComponentViewButton.clearListeners();
        createMeshComponentViewButton.addListener(scene::addNewMeshComponent);

        createMoveImageComponentViewButton.clearListeners();
        createMoveImageComponentViewButton.addListener(scene::addNewMoveImageComponent);

        createEntityViewButton.clearListeners();
        createEntityViewButton.addListener(scene::addNewEntity);

        registerUpdatable(playButton, playButtonText,
                createMeshComponentViewButton, createMeshComponentViewButtonText,
                createMoveImageComponentViewButton, createMoveImageComponentViewButtonText,
                createEntityViewButton, createEntityViewButtonText);
    }

    public void setScene(Scene newScene) {
        this.scene = (EditorScene) newScene;
        setButtonListeners();
    }

    public void update() {
        for(Sprite editorFrameSprites : EditorFrameSprite) editorFrameSprites.update();

        for (IUpdatable updatable : updatableviews) {
            updatable.update();
        }
    }

    private void createFrame(){
        EditorFrameSprite[0] = new Sprite(frameImagePath, 0, 0, 20, 0.5f);
        EditorFrameSprite[1] = new Sprite(frameImagePath, 0, 0, 0.25f, 20);
        EditorFrameSprite[2] = new Sprite(frameImagePath, windowWidth-16, 0, 0.25f, 20);
        EditorFrameSprite[3] = new Sprite(frameImagePath, 0, windowHeight-16, 20, 0.5f);

        for (Sprite sprite : EditorFrameSprite) {
            updatableviews.add(sprite);
        }
    }
}