最近开始使用带有桌子/舞台/按钮等的libgdx写一个MenuScreen但是我已经意识到,即使进入下一个屏幕,原始MenuScreen的按钮仍然是可点击的:(
这大致是发生的事情:
MainMenu
屏幕当您看到“选项”屏幕时,如果不单击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();
}
}
答案 0 :(得分:3)
您的舞台仍在处理输入。它是否可见无关紧要。除非新屏幕设置新处理器,否则应手动将其删除。你也应该手动调用dispose,因为它永远不会被自动调用(libgdx只调用hide())。
因此,您可以在hide();
中处理和删除处理器Gdx.input.setInputProcessor(null);
this.dispose()
答案 1 :(得分:0)
我遇到过类似的问题,但幸运的是我遇到了一个解决方案,甚至是Gdx.input.setInputProcessor(null);没有帮助。
解决方案:请在hide(){}方法中添加 stage.clear(); ,这显着解决了同样的问题。