0

从场景中分离我的精灵时,我得到一个超出范围的索引。请注意,我想从 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();
        }
    });
}
4

1 回答 1

5

是的。当您在 mEngine runOnUpdateThread 之外分离精灵时,这是一个常见问题。

所以你需要在里面写代码

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

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

        }
    });

或者您可以使用主要启动 Activity UI 线程,其中包括创建引擎和场景。两者都代表相同的任务。像:

BaseActivity.instance.runOnUpdateThread(new Runnable() {

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

        }
    });

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

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

希望,它可以帮助你。

于 2013-06-03T08:48:27.693 回答