2012-04-27 76 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  
      }  
     } 
    }); 
} 

希望它可以帮助你或其他人谁是寻找这些东西。