5

LibGdx Screen クラスを実装する 3 つのクラスがあります。

MainMenuScreen、LevelSelectScreen、GameScreen

今のところ、MainMenuScreen の setCatchBackKey を false に設定しているので、ゲームはバック プレスで終了します。

LevelSelectScreen と GameScreen は setCatchBackKey を true に設定しています。

GameScreen の render 関数内には、次のものがあります。

@Override
public void render(float delta)
{
    gameTime = delta;

    if (Gdx.input.isKeyPressed(Keys.BACK))
       new LevelSelectScreen(game);

    ...
}

これは、レベル選択を表示するように画面を設定し、LevelSelectScreens のレンダリング関数に次のものがあります。

@Override
public void render(float delta)
{
    if (Gdx.input.isKeyPressed(Keys.BACK))
        new MainMenuScreen(game);

    Update();
    Draw();
} //end render

これで発生する問題は、GameScreen を押し戻すと、LevelSelectScreen が画面に一瞬点滅し、その後 MainMenuScreen にまっすぐ戻ることです。

画面の初期化時に Back が既にプッシュされているかどうかを確認する変数を設定できると思いますが、LibGdx に「魔法の」関数が既に含まれているかどうか、またはこの問題を回避するコード構造があるかどうかに興味がありました。

4

4 に答える 4

4

まず、以下のように Stage クラスを拡張します。

public static class MyStage extends Stage{
    public MyStage(float width, float height, boolean keepAspectRatio, SpriteBatch batch){
        super(width, height, keepAspectRatio, batch);
    }       
    @Override
    public boolean keyDown(int keyCode) {
        if(keyCode==Keys.BACK||keyCode==Keys.MENU){
            if(getHardKeyListener()!=null)
                getHardKeyListener().onHardKey(keyCode, 1);
        }           
        return super.keyDown(keyCode);
    }
    @Override
    public boolean keyUp(int keyCode) {
        if(keyCode==Keys.BACK||keyCode==Keys.MENU){
            if(getHardKeyListener()!=null)
                getHardKeyListener().onHardKey(keyCode, 0);
        }
        return super.keyUp(keyCode);
    }   

    /*********************Hard key listener***********************/
    public interface OnHardKeyListener{
        /**
         * Happens when user press hard key 
         * @param keyCode Back or Menu key (keyCode one of the constants in Input.Keys)
         * @param state 1 - key down, 0 - key up  
         */
        public abstract void onHardKey(int keyCode, int state);
    }
    private OnHardKeyListener _HardKeyListener = null;  
    public void setHardKeyListener(OnHardKeyListener HardKeyListener) {
        _HardKeyListener = HardKeyListener;
    }       
    public OnHardKeyListener getHardKeyListener() {
        return _HardKeyListener;
    }
}

次に、Screenクラスで:

protected final MyStage stage;
public YourScreen(Game game)
{
    this.game = game;   
    stage = new MyStage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true, game.spriteBatch);                    

    Gdx.input.setInputProcessor(stage);  
    //prevents the app from being pause...      
    Gdx.input.setCatchBackKey(true);
    Gdx.input.setCatchMenuKey(true);

    //Sets hard key listener...
    stage.setHardKeyListener(new OnHardKeyListener() {          
        @Override
        public void onHardKey(int keyCode, int state) {
            if(keyCode==Keys.BACK && state==1){
                //do something      
            }       
        }
    });
}

あなたやこのようなものを探している他の誰かに役立つことを願っています.

于 2013-04-04T23:14:14.990 に答える
2

Gdx.input.isKeyPressed(int)を使用する代わりに、InputProcessorインターフェースを実装できます。

InputProcessorのドキュメント:http://libgdx.l33tlabs.org/docs/api/com/badlogic/gdx/InputProcessor.html

入力イベントを受信するためにInputProcessorを登録することを忘れないでください。Gdx.input.setInputProcessor(InputProcessor);

この特定のケースでは、keyDownを使用します。

于 2012-05-15T22:46:16.163 に答える
1

私がしているのは、戻るキーが最後に押された時刻を保存し、最近の場合は反応しないようにすることです。

于 2012-05-19T11:22:49.907 に答える
1

LevelSelectActivity、MainMenuActivity、GameActivity など、画面ごとに「AndroidApplication」クラスを拡張する Activity クラスを使用します。これらのクラスのそれぞれには、あなたが持っているクラスと同じように "Screen" 拡張クラス オブジェクトがあり、一時停止、再開、戻るキーの押下などのイベントの制御は、画面クラスではなくアクティビティ クラスの義務です。戻る必要がある場合は、GameActivity クラスなどで「finish()」メソッドを呼び出すだけです。SelectLevelActivity に自動的に移動します。

于 2012-04-28T08:43:00.713 に答える