删除精灵时,Andengine索引超出范围

时间:2013-06-02 12:58:10

标签: android andengine sprite

当从场景中删除我的精灵时,我得到一个超出范围的索引。请注意,我想从Explosion类中删除精灵,以使我的游戏类尽可能“干净”。

这是我创建精灵的地方。

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();
        }
    });
}

1 个答案:

答案 0 :(得分:5)

是的。当你在没有mEngine runOnUpdateThread的情况下分离精灵时,这是一个常见的问题。

所以你需要在

中编写代码
ResourceManager.getInstance().mEngine.runOnUpdateThread(new Runnable() {

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

        }
    });

或者您可以使用主要启动Activity UI线程,其中包括Engine& amp;现场。两者都代表相同的任务。喜欢:

BaseActivity.instance.runOnUpdateThread(new Runnable() {

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

        }
    });

要清理游戏场景,请在分离时使用 setIgnoreUpdate(true); 。此外,在创建精灵时使用 SetCullingEnabled(True)

对于许多精灵创建和分离,然后在运行时使用通用池。

希望,它会帮助你。