0

シーンからスプライトをデタッチすると、インデックスが範囲外になります。ゲームクラスをできるだけ「クリーン」に保つために、爆発クラスからスプライトを削除したいことに注意してください。

ここでスプライトを作成します。

mScene.registerUpdateHandler(new IUpdateHandler() {
    public void onUpdate(float pSecondsElapsed) {
        if(something) {
            final Explosion expl = new Explosion(m.getX(), m.getY(), 
                getVertexBufferObjectManager(), false, 65);

            mScene.attachChild(expl);
        }
    }
});

アニメーション終了時にスプライトを削除する爆発クラス

public class Explosion extends AnimatedSprite {

private final Explosion self;

public Explosion(float pX, float pY, VertexBufferObjectManager pVertexBufferObjectManager, 
        boolean loopAnimation, long frameDurationEach) {
    super(pX, pY, regExplosion, pVertexBufferObjectManager);

    this.self = this;

    this.animate(frameDurationEach, loopAnimation, new IAnimationListener() {

        @Override
        public void onAnimationStarted(AnimatedSprite pAnimatedSprite,
             int pInitialLoopCount) {
        }

        @Override
        public void onAnimationLoopFinished(AnimatedSprite pAnimatedSprite,
            int pRemainingLoopCount, int pInitialLoopCount) {

        }

        @Override
        public void onAnimationFrameChanged(AnimatedSprite pAnimatedSprite,
            int pOldFrameIndex, int pNewFrameIndex) {
        }

        @Override
        public void onAnimationFinished(AnimatedSprite pAnimatedSprite) {
            self.clearUpdateHandlers();
            self.detachSelf();
            self.dispose();
        }
    });
}
4

1 に答える 1

5

ええ、mEngine runOnUpdateThread の内部なしでスプライトをデタッチするとよくある問題です。

そのため、内部にコードを記述する必要があります

ResourceManager.getInstance().mEngine.runOnUpdateThread(new Runnable() {

        @Override
        public void run() {
         setIgnoreUpdate(true);
         self.clearUpdateHandlers();
         self.detachSelf();

        }
    });

または エンジンとシーンの作成で構成されるメインの起動アクティビティ UI スレッドを使用できます。どちらも同じタスクを表します。お気に入り:

BaseActivity.instance.runOnUpdateThread(new Runnable() {

        @Override
        public void run() {
            // do you work here

        }
    });

ゲーム シーンをクリーンアップするには、setIgnoreUpdate(true);を使用する必要があります。脱着時。また、スプライトの作成時にSetCullingEnabled(True)を使用します。

多くのスプライトの作成とデタッチでは、実行時に汎用プールを使用します。

うまくいけば、それはあなたを助けます。

于 2013-06-03T08:48:27.693 に答える