5

我有三个实现 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 中是否已经包含一些“神奇”功能,或者只是代码结构也可以解决这个问题。

4

4 回答 4

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

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

于 2013-04-04T23:14:14.990 回答
2

您可以实现 InputProcessor 接口,而不是使用 Gdx.input.isKeyPressed(int)。

InputProcessor 的文档:http: //libgdx.l33tlabs.org/docs/api/com/badlogic/gdx/InputProcessor.html

不要忘记注册您的 InputProcessor 以接收输入事件,使用: Gdx.input.setInputProcessor(InputProcessor);

对于这种特殊情况,请使用keyDown

于 2012-05-15T22:46:16.163 回答
1

我使用一个 Activity 类,它为我拥有的每个屏幕扩展“AndroidApplication”类,例如 LevelSelectActivity、MainMenuActivity 和 GameActivity。在这些类中的每一个中都有一个“屏幕”扩展类对象,就像您拥有的类一样,暂停、恢复和返回键等事件的控制是 Activity 类而不是屏幕类的职责。当需要返回时,只需调用例如 GameActivity 类中的“finish()”方法。它会自动转到 SelectLevelActivity。

于 2012-04-28T08:43:00.713 回答
1

我所做的是存储最后一次按下后退键的时间,如果只是最近就不要对其做出反应。

于 2012-05-19T11:22:49.907 回答