首页 文章

Libgdx:手机的后退按钮在屏幕之间继续

提问于
浏览
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 回答

  • 2

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

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

  • 1

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

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

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

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

  • 1

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

  • 4

    我所做的是存储最后一次按下后退键的时间,如果它刚刚出现,则不会对它做出反应 .

相关问题