Newer
Older
AlgebraicDataflowArchitectureModel / GameEngine / src / main / java / gameEngine / entites / gameComponents / TextMesh.java
NoranekoFelician 3 days ago 4 KB Portをクリックし、判別します
package gameEngine.entites.gameComponents;

import gameEngine.entites.Entity;
import gameEngine.input.Input;
import gameEngine.input.MouseInput;
import gameEngine.views.*;
import org.joml.Vector3f;

import static org.lwjgl.glfw.GLFW.*;

public class TextMesh extends Draggable{

    private Text textRenderer;
    private boolean isEditingText = false;
    private StringBuilder inputBuffer = new StringBuilder();

    public TextMesh(Entity parent, String text, int textSize) {
        this.parent = parent;
        this.textRenderer = new Text(parent.transform.position.x, parent.transform.position.y, text, textSize);
    }

    public TextMesh(TextMesh original, Entity newParent) {
        this.parent = newParent;
        this.textRenderer = new Text(
            newParent.transform.position.x,
            newParent.transform.position.y,
            original.textRenderer.text,
            original.textRenderer.textSize
        );
    }

    @Override
    public GameComponent 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);  // 編集終了時に色を戻す
            Window.get().getScene().clearSelectedEntity();
            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();
    }

}