package gameEngine.entites.gameComponents; import gameEngine.entites.Entity; import gameEngine.entites.GameObject; 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 TextMesh extends Draggable{ private Text textRenderer; private boolean isEditingText = false; private StringBuilder inputBuffer = new StringBuilder(); public TextMesh(GameObject 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, GameObject 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); // 編集終了時に色を戻す EditorScene scene = (EditorScene) Window.get().getScene(); scene.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(); } }