0

スプライトの取得とリサイクルを処理するために GenericPool を拡張するクラスを使用しています。私がやりたいのは、そのクラスに一定期間後にリサイクルするメソッドがあることです。何かのようなもの:

public void recyleIn(Sprite sprite, float durationSeconds) {}

そして、それを実装する適切な方法のように見える便利でダンディな DelayModifier があります。したがって、次のようなものになります。

public void recyleIn(MySprite mySprite, float durationSeconds) {
    mySprite.registerEntityModifier(
            new DelayModifier(
                    durationSeconds,

    new IEntityModifierListener() {

        @Override
        public void onModifierStarted(IModifier<IEntity> pModifier, IEntity pItem) {

        }

        @Override
        public void onModifierFinished(IModifier<IEntity> pModifier, IEntity pItem) {
            recycle(mySprite);
        }
    }

    ));
}

ここで問題があります。Sprite が「最終」でない限り、recycle() メソッドを呼び出すことも、そこでリサイクルを行うこともできません。通常、それは問題になりません。「最終的な」ディープコピーを作成して使用するだけです。ただし、この場合、コピーを作成すると、プールでのリサイクルの本来の目的が無効になります。(たとえば、とにかくコピーを作成するだけなら、なぜ最初からリサイクルしてプーリングを使用する必要があるのでしょうか?)

この種の適切なアプローチ/モデルに関するアイデアはありますか? 前もって感謝します。


アップデート:

うーん.. onModifierFinished() メソッドで IEntity パラメータを使用できることに気付きました。(何らかの理由でこれらのパラメーターを無視することに慣れています。) したがって、onModifierFinished() 内で次のようなことができます。

recycle((MySprite) pItem);

最良のアプローチについての誰かの考えにまだ興味がありますが、ここで明らかなことを見逃した可能性があると思います.

4

1 に答える 1

0

このような状況にある人たちを助けるために、先に進んで自分の質問に答えます。簡単に言えば、IEntity パラメーターの外部にあるオブジェクトではなく、IEntity パラメーターを使用する方が適切です。これを行う際に遭遇した 2 番目の問題は、このメソッドでシーンから IEntity をデタッチしたかったことですが、AndEngine では、IEntity がシーンからデタッチされるときに UpdateThread で発生する必要があることが重要です。何かが削除されている間にシーンが描画されているため、エラーが発生する可能性があります。最終結果は次のようになります。

        @Override
        public void onModifierFinished(IModifier<IEntity> pModifier, final IEntity pItem) {
            pool.getContext().runOnUpdateThread(new Runnable() {
                @Override
                public void run() {
                    pItem.detachSelf();
                }
            });

        }

もう 1 つの小さいながらも重要なポイントは、Ientity パラメーターの "final" 修飾子です。これは、run() スレッド内で呼び出すことができるようにするために必要です。

于 2013-01-31T20:17:29.620 に答える