2012-04-27 12 views
5

tengo tres clases que implementan libgdx clase Screen:libgdx: el botón atrás del teléfono continúa entre la pantalla de

MainMenuScreen, LevelSelectScreen, GameScreen

Por ahora he setCatchBackKey de MainMenuScreen se pone a falso, por lo que el juego se acaba de salida en la parte posterior presione.

LevelSelectScreen y GameScreen han establecidoCatchBackKey establecido en verdadero.

Dentro de la década de GameScreen función de hacer que tengo:

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

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

    ... 
} 

que fija la pantalla para mostrar el nivel de selección y en LevelSelectScreens de la función de hacer que tengo:

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

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

El problema me encuentro con esto es que cuando presiono de nuevo en GameScreen, LevelSelectScreen parpadea en la pantalla por un momento y luego vuelve directamente a MainMenuScreen.

Me imagino que podría establecer alguna variable para verificar si Back ya se está presionando cuando la pantalla se inicializa, pero era curioso si ya hay alguna función "mágica" incluida en LibGdx o solo una estructura de código que también funcionaría este problema.

Respuesta

1

Utilizo una clase de actividad que amplía la clase "AndroidApplication" para cada pantalla que tengo, por ejemplo LevelSelectActivity, MainMenuActivity y GameActivity. En cada una de estas clases hay un objeto de clase extendida "Pantalla" al igual que las clases que tiene, y el control de los eventos como pausar, reanudar y presionar tecla es el deber de las clases de actividad, no de las clases de pantalla. Cuando sea necesario volver atrás, simplemente llame al método "finish()" en, por ejemplo, la clase GameActivity. Va automáticamente a SelectLevelActivity.

+0

Gracias por el consejo, voy a ver si puedo hacer algo así para solucionar mi problema. – Fleck

1

Lo que hago es almacenar la hora cuando se presionó por última vez la tecla de retroceso, y no reacciono si es recientemente.

4

En primer lugar extender la clase Stage, como a continuación:

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

Luego, en su clase de 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  
      }  
     } 
    }); 
} 

Espero que usted o alguien que esté buscando esto ayuda.

Cuestiones relacionadas