如何使用后退键在LibGDX中暂停和恢复?

时间:2013-03-19 14:05:25

标签: android libgdx

我正在使用LibGDX制作游戏。现在我有两个问题。

首先,我试图抓住钥匙,以便游戏暂停。我已经在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实现ScreenInputProcessor

GameScreen中,我已拨打setInputProcessorGameScreen的代码是:

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方法并调用方法pauseGame

但是,这没有发生。我的游戏正在退出,并且未调用keyDown方法(如果调用方法keyDown,我已经尝试记录消息,但消息永远不会出现)。

我遇到的第二个问题是使用方法pause()暂停游戏。我认为如果主页按钮或设备收到呼叫,将调用pause中的方法GameScreen。所以,我想如果我想在按下主页按钮时暂停我的游戏,我会在方法pauseGame中调用方法pause。它运作良好。但问题出现在我按下后退按钮以便游戏退出。在游戏退出并且我再次尝试启动它之后,我的纹理没有被加载。

顺便说一下,目前我没有使用AssetManager,而是调用方法在构造函数中加载资源。

3 个答案:

答案 0 :(得分:3)

据我了解,您需要在致电InputProcessor之前设置setCatchBackKey。您可以通过将GameScreen构造函数更改为:

来解决此问题
public GameScreen(CvSGame pParent) {
    parent = pParent;
    Gdx.input.setInputProcessor(this);
    Gdx.input.setCatchBackKey(true);
}

相关问题:In libgdx, how do I get input from the back button?

至于纹理没有加载。确保在游戏被销毁(dispose功能)时,您正在卸载所有纹理并处理它们。重新创建游戏时,请务必再次加载它们。

列出的所有类here都需要手动处理,否则会导致泄漏。关于纹理,您可能会遇到加载纹理的问题,而无需先处理旧版本。

答案 1 :(得分:0)

对于您的用例(在按下后面调用pause方法),您不需要做任何特殊操作来捕获Back键。 Libgdx将在您注册的pause上调用ApplicationListener方法。请参阅ApplicationListener.pause() javadoc说明:

  

暂停应用程序时调用。应用程序在销毁之前暂停,当用户按下Android上的“主页”按钮或发生来电时。在桌面上,这只会在调用dispose()之前立即调用。

Game ApplicationListener会自动转发pause到当前的Screen

答案 2 :(得分:0)

您在课堂上实施InputProcessor吗?而且,正如@MCeley所说,你应该按顺序放置这些代码:

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

此外,在pauseMenu()方法中,添加一个布尔参数,这样一个好的旧标志:

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

GameScreen类中添加布尔值作为标志和字段。记住,标记就像一个标记,它是一种更好的方法来对抗或逆转它。在接受我的答案之前,你必须研究序列如何工作的流程,从最后开始而不是从开头开始。你必须通过重新跟踪步骤找出它是如何实现的。请注意,这在某种程度上是伪代码。