2013-06-02 3 views
0

내 스프라이트를 장면에서 디 텍트 할 때 인덱스가 범위를 벗어납니다. 가능한 한 "gameclass"를 "깨끗하게"유지하기 위해 Sprite 클래스를 제거하고 싶습니다.스프라이트를 제거 할 때 Andengine 인덱스가 범위를 벗어납니다.

여기 내가 스프라이트를 만드는 곳입니다. 애니메이션 당신이 mEngine runOnUpdateThread 내부없이 스프라이트를 분리 할 때 일반적인 문제입니다 yeah.It

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

나 자신을 알아 냈습니다. 나는 엔진을 폭발에 대한 논쟁으로 돌 렸는데, 폭발은 분리 스레드를 실행하고 업데이트 스레드에서 처리합니다. 그러나, 나는 폭발물이 엔진을 알아야한다고 생각하지 않기 때문에이 해결책을 좋아하지 않는다. 그래서 당신이 더 좋은 점을 알고 있다면, – Flexo

답변

5

완료 될 때 스프라이트를 제거

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

폭발 클래스입니다.

그래서 당신은

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 (사실)를 사용한다; 분리 할 때. 또한 스프라이트를 만들 때 SetCullingEnabled (True)을 사용하십시오.

많은 스프라이트 생성 및 분리의 경우 런타임시 일반 풀을 사용하십시오.

희망, 도움이됩니다.

+0

라고 말하지 말아라. 이것은 내가 생각해 냈던 것보다 낫다. 고마워요! – Flexo

+0

행복합니다. 도움이 .. @ Flexo –

+0

음, 솔루션은 GLES1에서만 작동하는 것 같습니다. GLES2와 비슷한 솔루션이 있습니까? – Flexo

관련 문제