4

LibGDX を使用してゲームを作成しています。今、私には2つの問題があります。

まず、ゲームが一時停止するようにキーをキャッチしようとしています。私はすでに自分のクラスで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する でを設定するメソッドです。GameScreenScreenInputProcessor

では、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;
    }
}

keyDownAndroid デバイスの [戻る] ボタンを押すと、メソッドが呼び出され、メソッドが呼び出されると思いますpauseGame

しかし、それは起こっていません。ゲームが終了し、keyDownメソッドが呼び出されません (メソッド keyDown が呼び出された場合、メッセージをログに記録しようとしていますが、メッセージは表示されません)。

私が抱えている2番目の問題は、メソッドでゲームを一時停止することによって引き起こされpause()ます。pauseホームボタンやデバイスに着信があればinのメソッドが呼び出されると思いますGameScreenpauseGameだから、ホームボタンが押されたときにゲームを一時停止したい場合は、 methodでメソッドを呼び出すと思いますpause。そして、それはうまく機能します。しかし、問題は戻るボタンを押した後に発生するため、ゲームが終了します。ゲームを終了して再起動しようとすると、テクスチャが読み込まれません。

ちなみに、現在は使っていませんAssetManagerがコンストラクタでアセットをロードするメソッドを呼び出しています。

4

3 に答える 3

3

InputProcessorを呼び出す前に設定する必要があることを理解していますsetCatchBackKeyGameScreenこれは、コンストラクターを次のように変更することで修正できます。

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、登録済みのメソッドを呼び出しますApplicationListenerApplicationListener.pause()次のJavadocを参照してください。

アプリケーションが一時停止されたときに呼び出されます。ユーザーが Android のホーム ボタンを押したとき、または着信が発生したときに、アプリケーションは破棄される前に一時停止されます。デスクトップでは、これは dispose() が呼び出される直前にのみ呼び出されます。

Game ApplicationListener自動的pauseに現在の に転送されScreenます。

于 2013-03-19T16:28:15.137 に答える