2012-12-15 62 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();隱藏(){}方法中的,這顯然解決了同樣的問題。