Libgdx: невозможно нажимать кнопки или просматривать диалоговое окно при добавлении в определенную сцену

#java #libgdx #dialog

#java #libgdx #диалоговое окно

Вопрос:

Пожалуйста, обратите внимание, что это не является полным, это просто базовая структура, чтобы показать, как все работает.

Я работаю над игрой; где вместо использования разных экранов вместо этого используются сцены. Структуру игрового кода смотрите ниже.

Как добавить игровые кнопки с текущим кодом:

Мне нужно просто добавить изображения в sceneTop и проверить, находится ли мышь в пределах определенного прямоугольника, если для нажатия кнопки требуется какое-то волшебство рендеринга. Пока все в порядке.

Проблема:

Я хочу добавить диалоговое окно, но оно работает некорректно. Он не только не отображает кнопки / текст диалогового окна, но и когда вы устанавливаете InputProcessor на сцену, содержащую диалоговое окно, область нажатия отключена (я предполагаю, что это связано с тем, что разные сцены являются многоуровневыми). Если я добавлю диалоговое окно в основной класс игры и в основном удалю строки, отображающие сцены, он работает отлично.

Альтернативный вариант:

Вместо этого я создал таблицу с полем выбора и добавил ее с помощью пакетного метода. Это показывает поле выбора, но не является интерактивным.

В классе MenuComponent я хочу реализовать либо диалоговое окно, либо таблицу. По сути, я хочу, чтобы всплывающее окно с полем выбора что-то меняло в игре.

 Main Game: // being initialized in main method of another class that setups the main window
public class Game extends ApplicationAdapter
    public void create () {
        context = new GameContext(this);
        context.create();
    }
    public void render () {
        for (GameScene scene : context.getScenes()) {
            scene.update();
            scene.render();
        }
    }

GameContext class:
    public void create() {
        this.connectScene = new ConnectScene(this); //basically a log in screen
        connectScene.create();
    }
    public void createScenes() { // called when login button is pressed
        this.input = new GameInputProcessor(this); //sets this inputProcessor in a later method
        this.sceneTop = new sceneTop(this);
        sceneTop.create();
        this.sceneBottom= new sceneBottom(this);
        sceneBottom.create();
        //fix crash on server disconnect after dispose has been called
        if(sceneList.size() == 0) {
            sceneList.add(sceneBottom);
            sceneList.add(sceneTop );
        }else {
            sceneList.set(0, sceneBottom);
            sceneList.set(1, sceneTop );
        }
    }

public class GameInputProcessor implements InputProcessor {
    public GameInputProcessor(GameContext context) {
        this.context = context;
        Gdx.input.setInputProcessor(this);
    }

    @Override
    public boolean keyDown(int keycode) {
    }

    @Override
    public boolean keyUp(int keycode) {
    }

    @Override
    public boolean keyTyped(char character) {
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        for (GameScene scene : context.getScenes()) {
            if (scene.handleClick(screenX, screenY, button)) {
                break;
            }
        }

        return false;
    }

    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button) {
        for (GameScene scene : context.getScenes()) {
            if (scene.handleClickRelease(screenX, screenY, button)) {
                break;
            }
        }
        return false;
    }

    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer) {
        float x = Gdx.input.getDeltaX();
        float y = Gdx.input.getDeltaY();
        for (GameScene scene : context.getScenes()) {
            if (scene.handleDrag(screenX, screenY, x, y)) {
                break;
            }
        }

        return false;
    }

    @Override
    public boolean mouseMoved(int screenX, int screenY) {
        for (GameScene scene : context.getScenes()) {
            if (scene.handleMouseMove(screenX, screenY)) {
                break;
            }
        }
        return false;
    }

    @Override
    public boolean scrolled(int amount) {
    }

sceneTop class

public class sceneTop implements GameScene {
    private GameContext context;
    public void create() {
    //does its own create stuff for that specific scene (player stuff)
    mainmenu = new MenuComponent(context);
    }
    public void render(){
    //do other render stuff before with spritebatch
    mainmenu.render();
    }


sceneBottom class

public class sceneBottom implements GameScene {
    private GameContext context;
    public void create() {
    //does its own create stuff for that specific scene (control/inventory stuff)
    }


GameScene class:

public interface GameScene {
    void create();

    void update();

    void render();

    void dispose();

    boolean handleDrag(float screenX, float screenY, float diffX, float diffY);

    boolean handleClick(float x, float y, int button);

    boolean handleMouseMove(float x, float y);

    boolean handleClickRelease(float x, float y, int button);
}

Menu class:
public class MenuComponent extends SceneComponent<sceneTop> implements InputProcessor {
//public abstract class SceneComponent<T extends GameScene> // <--- SceneComponent class
    public void create() {
        Skin skin = new Skin(Gdx.files.internal("uiskin.json"));
        table = new Table();
        orthoCamera = new OrthographicCamera();
        selectBox=new SelectBox<String>(skin);
        selectBox.setSize(100, 100);
        selectBox.setPosition(10, 10);
        selectBox.setItems("XYZ","ABC","PQR","LMN");
        table.add(selectBox);
        table.setPosition(300, 100);
        stage.addActor(table);
    }
    public void render(){
        table.draw( batch, 1f );
    }
}
  

введите описание изображения здесь

Комментарии:

1. Возможно, вам следует заглянуть в пакет scene2d.ui, который должен вам очень помочь.

2. @MrStahlfelge Как бы это помогло мне? Я также использовал таблицу из пакета, но область нажатия полностью отключена.

3. Вам помогло бы то, что многие коды предопределены и, как известно, работают.