catchbackkey不工作(libgdx)Android

时间:2013-03-30 15:02:01

标签: android libgdx

我正在尝试使用Android设备上的后退键来为我的游戏设置屏幕..但它似乎不起作用.. 我在网上看了几篇帖子,这样做了......

在菜单屏幕中,如果按下反键,应用程序应该退出..但是没有触发任何操作...即使按下后退键,也会触发很多操作...

public class MenuScreen extends AbstractScreen implements InputProcessor  {

@Override
   public void show()
   {
      Gdx.input.setInputProcessor(this);
      Gdx.input.setCatchBackKey(true);
      Gdx.input.setCatchMenuKey(true);

}


   @Override
   public boolean keyDown(int keycode) {
      // TODO Auto-generated method stub
        if(keycode == Keys.BACK)
        { 
             Gdx.app.exit();
          }

      return false;
   }

在LevelScreen中按下后退键时,屏幕应设置为menuscreen,但我的应用程序将退出 有没有办法禁用后退键?如果按下它会发生什么?

  public class LevelScreen extends AbstractScreen  implements InputProcessor {

@Override
   public void show()
   {
      Gdx.input.setInputProcessor(this);
      Gdx.input.setCatchBackKey(true);
      Gdx.input.setCatchMenuKey(true);

}

@Override
   public boolean keyDown(int keycode) {
      if(keycode == Keys.BACK)
      {
                game.setScreen(game.geMenuScreen());
           }
      // TODO Auto-generated method stub
      return false;
   }

2 个答案:

答案 0 :(得分:3)

首先,您可能希望将其从使用keyDown()更改为输入处理器中的keyUp()。 keyUp()只会在用户释放密钥时调用一次,但是后退密钥关闭的每一帧都会调用keyDown()(大约每秒60次)。因此,您的应用可以切换屏幕并在2帧内关闭,这可能不是您想要的。

这可能是您从关卡屏幕看到该应用关闭的原因。这将是LevelScreen - > ScoreScreen - > MenuScreen然后退出3帧(大约50毫秒)。以下是在ScoreScreen中启动的应用程序的示例代码。当用户按下(并释放)后退按钮进入菜单屏幕时。接下来,当他们再次按下(并释放)后退按钮时,它会关闭应用程序。

您需要将此代码改编为您的游戏,但这应该为您提供一些可供查看和使用的内容。 (注意:我已经验证了这适用于Android 2.3.3和LibGDX 0.9.8)

public class BackTest extends Game {
    public Screen menu;
    public Screen score;

    @Override public void create() {
        Gdx.input.setCatchBackKey(true);
        this.menu = new MenuScreen(this);
        this.score = new ScoreScreen(this);
        this.setScreen(this.score);
    }

    public static abstract class AbstractScreen implements Screen {
        @Override public void render(final float delta) {}
        @Override public void resize(final int width, final int height) {}
        @Override public void show() {}
        @Override public void hide() {}
        @Override public void pause() {}
        @Override public void resume() {}
        @Override public void dispose() {}
    }

    public static class MenuScreen extends AbstractScreen {
        public final BackTest game;

        public MenuScreen(final BackTest game) {
            this.game = game;
        }

        @Override public void show() {
            Gdx.app.log("Menu", "Show");
            Gdx.input.setInputProcessor(new InputAdapter() {
                @Override public boolean keyUp(final int keycode) {
                    if (keycode == Keys.BACK) {
                        Gdx.app.log("Menu", "Quit");
                        Gdx.app.exit();
                    }
                    return false;
                }
            });
        }
    }

    public static class ScoreScreen extends AbstractScreen {
        public final BackTest game;

        public ScoreScreen(final BackTest game) {
            this.game = game;
        }

        @Override public void show() {
            Gdx.app.log("Score", "Show");
            Gdx.input.setInputProcessor(new InputAdapter() {
                @Override public boolean keyUp(final int keycode) {
                    if (keycode == Keys.BACK) {
                        Gdx.app.log("Score", "Back");
                        ScoreScreen.this.game.setScreen(ScoreScreen.this.game.menu);
                    }
                    return false;
                }
            });
        }
    }
}

答案 1 :(得分:2)

你应该改为@Override keyUp按钮。

@Override
    public boolean keyUp(int keycode) {
        if ((state == SETTING_STATE || state == TOPSCORES_STATE) && keycode == Keys.BACK) {
            state = RUNNING_STATE;
            is_game_start = true;
        } else {
            Gdx.app.exit();
        }
        return false;
    }