Как приостановить и возобновить работу в LibGDX с помощью обратного ключа?

Я создаю игру с помощью LibGDX. Теперь у меня две проблемы.

Во-первых, я пытаюсь уловить ключ, чтобы игра остановилась. Я уже Gdx.input.setCatchBackKey(true) метод Gdx.input.setCatchBackKey(true) в классе Game . Вот код:

 public class CvSGame extends Game { public Preferences prefs; @Override public void create() { Gdx.input.setCatchBackKey(true); prefs = Gdx.app.getPreferences("game_pref"); //setScreen(new SplashScreen(this)); //setScreen(new HomeScreen(this)); //setScreen(new GameScreen(this)); GamePlay.initialized(this); } } 

GamePlay.initialized – это метод установки Game с GameScreen который реализует Screen и InputProcessor .

В GameScreen я уже вызываю setInputProcessor . Код для GameScreen :

 public class GameScreen implements Screen, InputProcessor{ CvSGame parent; public GameScreen(CvSGame pParent){ parent = pParent; Gdx.input.setInputProcessor(this); } @Override public void show() { } @Override public void resize(int width, int height) { } @Override public void render(float delta) { } @Override public void hide() { } @Override public void pause() { } @Override public void resume() { } @Override public void dispose() { } @Override public boolean keyDown(int keycode) { if(keycode == Keys.BACK) { pauseGame(); } return false; } @Override public boolean keyUp(int keycode) { return false; } @Override public boolean keyTyped(char character) { return false; } @Override public boolean touchDown(int screenX, int screenY, int pointer, int button) { return false; } @Override public boolean touchUp(int screenX, int screenY, int pointer, int button) { return false; } @Override public boolean touchDragged(int screenX, int screenY, int pointer) { return false; } @Override public boolean mouseMoved(int screenX, int screenY) { return false; } @Override public boolean scrolled(int amount) { return false; } private void pauseGame(){ GamePlay.gameState = GamePlay.PAUSED; } } 

Я думаю, если нажать кнопку «Назад» на моем Android-устройстве, она keyDown метод keyDown и pauseGame метод pauseGame .

Но этого не происходит. Моя игра keyDown метод keyDown не вызывается (я уже пытаюсь записать сообщение, если вызван метод keyDown, но сообщение никогда не появляется).

Вторая проблема, которую я испытываю, вызвана приостановкой игры с помощью метода pause() . Я думаю, что если домашняя кнопка или устройство получит вызов, будет вызвана pause метода в GameScreen . Итак, я думаю, что если я хочу приостановить игру, когда нажата кнопка дома, я вызываю метод pauseGame в методе pause . И он работает хорошо. Но проблема возникает после того, как я нажму кнопку «Назад», чтобы игра прекратилась. После того, как игра завершается, и я пытаюсь запустить ее снова, моя текстура не загружается.

Кстати, в настоящее время я не использую AssetManager но вызываю метод для загрузки активов в конструкторе.

Я понимаю, что вам нужно установить свой InputProcessor перед вызовом setCatchBackKey . Вы можете исправить это, изменив конструктор GameScreen на:

 public GameScreen(CvSGame pParent) { parent = pParent; Gdx.input.setInputProcessor(this); Gdx.input.setCatchBackKey(true); } 

Связанный вопрос: В libgdx, как я могу получить ввод от кнопки «Назад»?

Что касается текстуры, не загружаемой. Удостоверьтесь, что когда ваша игра будет уничтожена ( dispose функцию), вы разгружаете все свои текстуры и удаляете их. Когда ваша игра будет воссоздана, обязательно загрузите их снова.

Все перечисленные здесь классы необходимо утилизировать вручную или вызвать утечки. Что касается текстур, вы можете столкнуться с проблемами загрузки текстур, прежде чем сначала избавиться от своих старых копий.

Для вашего случая использования (при вызове метода pause при нажатии) вам не нужно делать что-либо особенное, чтобы поймать клавишу «Назад». Libgdx вызовет метод pause в вашем зарегистрированном ApplicationListener . См. ApplicationListener.pause() javadoc, который гласит:

Вызывается, когда приложение приостановлено. Приложение приостанавливается до его уничтожения, когда пользователь нажал кнопку «Домой» на Android или произошел входящий звонок. На рабочем столе это будет вызвано непосредственно перед вызовом утилиты ().

Game ApplicationListener автоматически переводит pause на текущий Screen .

Вы внедряете InputProcessor в свой класс? А также, как @MCeley сказал, что вы должны привести этот код в порядок:

  Gdx.input.setInputProcessor(this); Gdx.input.setCatchBackKey(true); 

Кроме того, в pauseMenu() добавьте Boolean параметр, старый добрый флаг:

  private void pauseGame(boolean isPaused){ if(isPaused) { GamePlay.gameState = GamePlay.PAUSED; } else { GamePlay.gameState = GamePlay.UNPAUSED; } } 

Добавьте логическое значение в качестве флага и поля в класс GameScreen . Помните, что пометка похожа на маркер, и это лучший способ встретить или отменить его. Прежде чем принять мой ответ, вы должны изучить поток, как работает последовательность, начиная с конца, а не в начале. Вы должны выяснить, как это произошло, перечеркнув шаги. Обратите внимание, что это псевдокод, в некотором роде.