4

我正在使用 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是一种设置 的方法,GameGameScreen实现了ScreenInputProcessor

在中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方法并且该方法pauseGame将被调用。

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

我遇到的第二个问题是使用该方法暂停游戏引起的pause()。我认为如果主页按钮或设备收到呼叫,则会调用其中的pause方法GameScreen。所以,我想如果我想在按下主页按钮时暂停我的游戏,我会调用 methodpauseGame中的方法pause。而且效果很好。但是问题出现在我按下后退按钮后,游戏就会退出。游戏退出后我尝试重新启动它,我的纹理没有加载。

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

4

3 回答 3

3

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

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

相关问题:在 libgdx 中,如何从后退按钮获取输入?

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

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

于 2013-03-19T14:16:44.187 回答
0

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

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

Game ApplicationListener自动转发pause到当前Screen,甚至。

于 2013-03-19T16:28:15.137 回答
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类中的标志和字段。请记住,标记就像一个标记,它是一种更好的反击或反转它的方法。在接受我的答案之前,您必须研究序列如何工作的流程,从结尾而不是开头开始。您必须通过重新跟踪这些步骤来了解它是如何到达那里的。请注意,在某种程度上,这是一个伪代码。

于 2013-11-14T06:45:28.153 回答