3

最近开始使用带有表格/舞台/按钮等的 libgdx 编写 MenuScreen 但是我意识到即使在进入下一个屏幕之后,原始 MenuScreen 的按钮仍然是可点击的 :(

大致是这样的:

  1. 应用程序启动,查看MainMenu屏幕
  2. 单击一个按钮(例如:“选项”),请参阅选项屏幕
  3. 单击选项屏幕中的某个位置,该屏幕中的 MainMenu 按钮曾经是(例如关于)
  4. 转到“关于”屏幕

当您看到“选项”屏幕时,如果您没有单击 MainMenu 具有按钮的位置,则“选项”屏幕将正常/预期工作。

因此,从这种行为来看,MainMenu 屏幕似乎仍然存在(只是隐藏)并且所有按钮侦听器仍然处于活动状态。

清理 MainMenu 屏幕的正确方法是什么?(我想通常清理 libgdx 屏幕)

重要的代码位:

public class MainMenu implements Screen {

    public MainMenu() {
        // ..setting up font, camera etc

        stage = new Stage();
        stage.setCamera(camera);
        Table table = new Table();
        table.setWidth(300);
        table.setHeight(480);
        stage.addActor(table);

        TextButton options = new TextButton("Options", buttonStyle);
        options.addListener(new ButtonClickListener(app.options));
        table.add(options).pad(20);
        table.row();        

        // ... more buttons, eg About...

        Gdx.input.setInputProcessor(stage);
    }


    private class ButtonClickListener extends ClickListener {
        private final Screen screen;

        private ButtonClickListener(Screen screen) {
            this.screen = screen;
        }

        @Override
        public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
            app.setScreen(this.screen);
        }
    }

    public void render(float delta) {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

        camera.update();

        spriteBatch.begin();
        stage.draw();
        spriteBatch.end();
    }

    // ... show(), resize(), hide(), pause(), resume() are all no-ops

    @Override
    public void dispose() {
        stage.dispose();
        spriteBatch.dispose();
        font.dispose();
    }
}
4

2 回答 2

3

您的阶段仍在处理输入。它是否可见并不重要。除非新屏幕设置了新处理器,否则您应该手动删除它。您还应该手动调用 dispose,因为它从未被自动调用(libgdx 仅调用 hide())。

因此,您可以在 hide(); 中处理和删除处理器;

Gdx.input.setInputProcessor(null);
this.dispose()
于 2012-12-15T18:51:56.590 回答
0

我遇到过类似的问题,但幸运的是我遇到了一个解决方案,甚至 Gdx.input.setInputProcessor(null); 没有帮助。

解决方案:请添加stage.clear(); 在 hide(){} 方法中,这显着解决了同样的问题。

于 2017-08-24T02:21:10.213 回答