1

シナリオは次のとおりです。

私は次のシーンを持っています:

  1. スプラッシュシーン
  2. ローディングシーン
  3. ゲームモードシーン
  4. PlayModeScene
  5. ゲームシーン

シーン間のナビゲーションを管理する SceneController クラスがあります。
SceneController には、すべてのシーンへのインスタンスがあります。

すべてのシーン インスタンスを初期化し、LoadingScene ですべてのシーン リソースをロードしています。

シーンを GameModeScene から PlayModeScene に変更すると、完全に正常に動作します。
しかし、シーンを GameModeScene に再度変更しようとすると、GameModeScene の最初の実行時に初期化されたブール値とその他の変数がそのまま残り、リセットされません。

: 変数は各クラスに対してプライベートであり、静的ではありません

pGameModeSceneto.reset(); を試しました。しかし、うまくいきません。
何か提案はありますか?

シーンのインスタンスを初期化する方法は次のとおりです


SceneController.loadSceneResources()

public void loadSceneResources(SceneType mType){
        switch(mType){
        case SplashScene:
            this.mSplashScene = new SplashScene(this.mActivity);
            break;


        case LoadingScene:
            mLoadingScene = new LoadingScene(mActivity);
            break;

        case GameModeScene:
            mGameModeScene=new GameModeScene(this.mActivity);
            break;

        case PlayModeScene:
            mPlayModeScene=new PlayModeScene(this.mActivity);
            break;

        case GameScene:
            break;

            default:
        }
    }

各クラスのコンストラクターがリソースをロードしています。


現在のシーン インスタンスを取得する方法は次のとおりです。

SceneController.getScene() public Sc​​ene getScene(SceneType mType){

        switch(mType){
        case SplashScene:
            this.mCurrentScene = mSplashScene;
            break;


        case LoadingScene:
            this.mCurrentScene = mLoadingScene;
            break;

        case GameModeScene:
            this.mCurrentScene = mGameModeScene;
            break;

        case PlayModeScene:
            this.mCurrentScene = mPlayModeScene;
            break;

            default:
        }
4

2 に答える 2

1

org.andengine.entity.scene.Sceneクラスには、reset()メソッドがあります。これは、あなたが言うときに参照していると思います。

pGameModeSceneto.reset();を試しました。しかし、それは機能しません。

その方法は次のとおりです。

@Override
public void reset() {
    super.reset();

    this.clearChildScene();
}

あなたのシーン(私は推測します)はSceneを拡張しています。したがって、それらに対してreset()を呼び出すときは、super.reset()呼び出しを介して、親レベルの情報とそこからツリーの上位にある情報を初期化するだけです。(シーンはエンティティを拡張します。)シーンで作成および設定するプライベートフィールドは、これによる影響を受けません。必要な動作を得るには、個々のシーンクラスのreset()メソッドをオーバーライドします。それらの先頭でsuper.reset()を呼び出し、初期化情報を追加してください。つまり、「空の」シーンがどのように見えるかを確認してください。このようなもの:

@Override
public void reset() {
    super.reset();
    myLocalInt = 0; 
    myLocalFancyPantsObject = null;
}
于 2013-02-11T21:32:26.800 に答える
1

あなたが私たちに言ったことを考えると、あなたが言ったことは完全に理にかなっています。

reset()何らかのメソッドをシーンに追加し、別のシーンに切り替えるとき、または特定のシーンを離れるときにそれを呼び出したいと思うでしょう。

しかし...それらがクラスの変数である場合、その組み込みreset()メソッドは変数をリセットできません。

のようなメソッドを追加しresetSceneVars()、シーンを作成したときと同じにする必要があるものをすべて再初期化します。シーンへの参照を維持している限り、これらの変数は最新の値を保持します。

于 2013-02-11T16:10:40.867 に答える