3

我正在尝试使用 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;
   }
4

2 回答 2

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;
                }
            });
        }
    }
}
于 2013-03-30T17:43:17.283 回答
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;
    }
于 2013-07-17T10:30:27.087 回答