2012-12-15 36 views
3

最近开始使用libgdx与表/舞台/按钮等不过,我已经意识到,即使去到下一个屏幕后,原来的MenuScreen的按钮仍然可点击:(写MenuScreenligbdx触摸监听器错误屏幕上

这大概会发生什么:

  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(); 
    } 
} 

回答

3

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

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

Gdx.input.setInputProcessor(null); 
this.dispose() 
+0

有趣的是,我通过清理舞台来解决问题 - 尽管重置Gdx.input似乎也有道理。也会考虑手动调用dispose()(已经在一些地方做过) – pyko

0

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

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