2012-04-27 77 views
5

之間電話的後退按鈕繼續我實現LibGdx Screen類三類:Libgdx:屏幕

MainMenuScreen,LevelSelectScreen,GameScreen

現在我已經MainMenuScreen的setCatchBackKey設置爲false,所以本場比賽將只退出在後面按。

LevelSelectScreen和GameScreen將setCatchBackKey設置爲true。

內GameScreen的渲染功能,我有:

@Override 
public void render(float delta) 
{ 
    gameTime = delta; 

    if (Gdx.input.isKeyPressed(Keys.BACK)) 
     new LevelSelectScreen(game); 

    ... 
} 

這臺屏幕顯示水平選擇和在LevelSelectScreens的渲染功能,我有:

@Override 
public void render(float delta) 
{ 
    if (Gdx.input.isKeyPressed(Keys.BACK)) 
     new MainMenuScreen(game); 

    Update(); 
    Draw(); 
} //end render 

我碰到這個是問題當我按下GameScreen時,LevelSelectScreen閃爍屏幕片刻,然後直接返回MainMenuScreen。

我覺得我可以設置一些變量來檢查當屏幕初始化時Back是否已經被按下,但是隻是好奇,如果LibGdx中已經包含了一些「魔法」功能或者只是代碼結構也可以解決這個問題。

回答

1

我使用了一個Activity類,它爲每個屏幕擴展了「AndroidApplication」類,例如LevelSelectActivity,MainMenuActivity和GameActivity。 在每個這些類中都有一個「Screen」擴展類對象,就像您擁有的類一樣,並且控制諸如暫停,恢復和後退鍵這樣的事件是Activity類而不是屏幕類的職責。 當需要返回時,只需調用GameActivity類中的「finish()」方法即可。它會自動轉到SelectLevelActivity。

+0

感謝您的建議,我會看看我是否可以這樣做來解決我的問題。 – Fleck 2012-04-30 15:44:55

1

我所做的是存儲上次按鍵的時間,如果最近纔對此做出反應。

4

首先擴展Stage類象下面這樣:

public static class MyStage extends Stage{ 
    public MyStage(float width, float height, boolean keepAspectRatio, SpriteBatch batch){ 
     super(width, height, keepAspectRatio, batch); 
    }  
    @Override 
    public boolean keyDown(int keyCode) { 
     if(keyCode==Keys.BACK||keyCode==Keys.MENU){ 
      if(getHardKeyListener()!=null) 
       getHardKeyListener().onHardKey(keyCode, 1); 
     }   
     return super.keyDown(keyCode); 
    } 
    @Override 
    public boolean keyUp(int keyCode) { 
     if(keyCode==Keys.BACK||keyCode==Keys.MENU){ 
      if(getHardKeyListener()!=null) 
       getHardKeyListener().onHardKey(keyCode, 0); 
     } 
     return super.keyUp(keyCode); 
    } 

    /*********************Hard key listener***********************/ 
    public interface OnHardKeyListener{ 
     /** 
     * Happens when user press hard key 
     * @param keyCode Back or Menu key (keyCode one of the constants in Input.Keys) 
     * @param state 1 - key down, 0 - key up 
     */ 
     public abstract void onHardKey(int keyCode, int state); 
    } 
    private OnHardKeyListener _HardKeyListener = null; 
    public void setHardKeyListener(OnHardKeyListener HardKeyListener) { 
     _HardKeyListener = HardKeyListener; 
    }  
    public OnHardKeyListener getHardKeyListener() { 
     return _HardKeyListener; 
    } 
} 

然後在您的Screen類:

protected final MyStage stage; 
public YourScreen(Game game) 
{ 
    this.game = game; 
    stage = new MyStage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true, game.spriteBatch);      

    Gdx.input.setInputProcessor(stage); 
    //prevents the app from being pause...  
    Gdx.input.setCatchBackKey(true); 
    Gdx.input.setCatchMenuKey(true); 

    //Sets hard key listener... 
    stage.setHardKeyListener(new OnHardKeyListener() {   
     @Override 
     public void onHardKey(int keyCode, int state) { 
      if(keyCode==Keys.BACK && state==1){ 
       //do something  
      }  
     } 
    }); 
} 

希望它可以幫助你或其他人誰是尋找這些東西。