2012-04-27 6 views
5

Ho tre classi che implementano LibGdx classe Screen:Libgdx: tasto posteriore del telefono continua tra schermo

MainMenuScreen, LevelSelectScreen, GameScreen

Per ora ho setCatchBackKey di MainMenuScreen impostato su false, in modo che il gioco sarà solo uscita sulla stampa posteriore.

LevelSelectScreen e GameScreen hanno impostato setCatchBackKey su true.

Entro i GameScreen della funzione di rendering che ho:

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

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

    ... 
} 

che imposta lo schermo per visualizzare il livello di selezione e in LevelSelectScreens della funzione di rendering che ho:

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

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

Il problema mi imbatto in questo è che quando premo di nuovo sul GameScreen, il LevelSelectScreen lampeggia sullo schermo per un momento e poi torna direttamente a MainMenuScreen.

Ho capito che ho potuto impostare una variabile per verificare se Indietro è già spinto quando lo schermo inizializza, ma ero solo curioso di sapere se v'è una certa funzione di "magico" già incluso all'interno LibGdx o solo la struttura del codice che avrebbe anche aggirare questo problema.

risposta

1

Uso una classe di attività che estende la classe "AndroidApplication" per ogni schermata che dispongo, ad esempio LevelSelectActivity, MainMenuActivity e GameActivity. In ognuna di queste classi c'è un oggetto di classe esteso "Screen" proprio come le classi che hai, e il controllo degli eventi come la pausa, la ripresa e la pressione di back-key è compito delle classi di attività e non delle classi di schermate. Quando è necessario tornare indietro, basta chiamare il metodo "finish()" nella classe GameActivity ad esempio. Passa automaticamente a SelectLevelActivity.

+0

Grazie per il consiglio, vedrò se riesco a fare qualcosa del genere per risolvere il mio problema. – Fleck

1

Quello che faccio è memorizzare l'ora in cui è stato premuto l'ultimo tasto Indietro e non reagire se è solo di recente.

4

Prima di tutto estendere la classe Stage come di seguito:

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

Poi nella classe 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  
      }  
     } 
    }); 
} 

Spero che voi o qualcun altro che è alla ricerca di questa roba aiuta.

Problemi correlati