我有三个实现LibGdx Screen类的类:

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中是否已经包含某些“神奇”功能,或者只是代码结构也可以解决此问题。

最佳答案

首先扩展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
            }
        }
    });
}

希望它对您或正在寻找这些东西的其他人有所帮助。

07-28 01:28
查看更多