2012-04-27 11 views
5

間続けて:Libgdx:携帯電話の戻るボタンは、私がLibGdx画面のクラスを実装する三つのクラス持っ画面

MainMenuScreen、LevelSelectScreenを、GameScreen

今のところ、私はMainMenuScreenのsetCatchBackKeyがfalseに設定されているので、ゲームだけで終了しますバックプレスで。

LevelSelectScreenとGameScreenには、setCatchBackKeyがtrueに設定されています。

選択レベルを示し、LevelSelectScreens年代に私が持っている機能レンダリングする画面を設定します
@Override 
public void render(float delta) 
{ 
    gameTime = delta; 

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

    ... 
} 

:私はこれでに実行し、問題がある

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

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

を私が持っているGameScreenのrender関数内

GameScreenを押すとLevelSelectScreenが一瞬画面に点滅し、MainMenuScreenにまっすぐに戻ります。

私は、画面が初期化されたときにBackが既にプッシュされているかどうかをチェックする変数を設定することができましたが、LibGdxに既に含まれている「魔法の」関数や、この問題。

答えて

1

LevelSelectActivity、MainMenuActivity、GameActivityなど、私が持っている各画面の "AndroidApplication"クラスを拡張するActivityクラスを使用します。 これらの各クラスには、あなたが持っているクラスと同じように "Screen"拡張クラスオブジェクトがあり、一時停止、再開、バックキー押下などのイベントの制御は、画面クラスではなくアクティビティクラスの義務です。 戻ってくる必要があるときは、例えばGameActivityクラスの "finish()"メソッドを呼び出してください。自動的にSelectLevelActivityに移動します。

+0

アドバイスをいただきありがとうございます。私の問題を回避するためにそのようなことができるかどうかがわかります。 – Fleck

2

Gdx.input.isKeyPressed(int)を使用する代わりに、InputProcessorインターフェイスを実装できます。 InputProcessorため

ドキュメント:http://libgdx.l33tlabs.org/docs/api/com/badlogic/gdx/InputProcessor.html

いけない、それはで、入力イベントを受信するためにあなたのInputProcessorを登録することを忘れ: Gdx.input.setInputProcessor(InputProcessor)。

この特定のケースでは、keyDownを使用してください。

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

が、それはこのようなものを探している方、あなたや他の誰かに役立ちます願っています。

関連する問題