libgdx在错误的屏幕上触摸侦听器

时间:2012-12-15 08:01:14

标签: android libgdx

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

这大致是发生的事情:

  1. 应用启动,请参阅MainMenu屏幕
  2. 单击按钮(例如:“选项”),参见选项屏幕
  3. 点击选项屏幕中的某处,其中MainMenu的按钮曾经是(例如,关于)
  4. 转到“关于”屏幕
  5. 当您看到“选项”屏幕时,如果单击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();
        }
    }
    

2 个答案:

答案 0 :(得分:3)

您的舞台仍在处理输入。它是否可见无关紧要。除非新屏幕设置新处理器,否则应手动将其删除。你也应该手动调用dispose,因为它永远不会被自动调用(libgdx只调用hide())。

因此,您可以在hide();

中处理和删除处理器
Gdx.input.setInputProcessor(null);
this.dispose()

答案 1 :(得分:0)

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

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