2012-02-19 5 views
3

나는 무작위로 화면 주위로 튀는 공 스프라이트를 많이 만듭니다. 만졌을 때 나는 공을 현장에서 제거하기를 원합니다. (두 개 이상의 공이 같은 공간을 차지하면 그 순간에도 제거됩니다.)Andengine을 사용하여 스프라이트를 안전하게 제거하십시오.

내가 scene.detachChild가 runOnUpdateThread에서 실행해야합니다 실현, 내 볼 스프라이트 서브 클래스에서, 그래서 나는 onAreaTouched 대체하여 터치에 detachChild :

 @Override 
    public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) 
    { 
     ((BaseGameActivity) thisAct).runOnUpdateThread(new Runnable() { 
      @Override 
      public void run() { 
       /* Now it is save to remove the entity! */ 


        //scene.unregisterTouchArea(Ball.this); 
        scene.detachChild(Ball.this); 

      } 
     }); 
     return false; 
    } 

것은 내가 생성자에 주요 활동에 통과해야 볼 스프라이트를 제거한 다음 주요 활동 장면에서 공을 제거하십시오.

scene.unregisterTouchArea (Ball.this) 행의 주석 처리를 제거한 경우 터치에 작용하는 스프라이트를 중지하려면 (제거에는 영향을 미치지 않지만 처리중인 터치를 중지하는 것이 더 바람직하다고 생각 함) indexOutOfBoundsException은 runOnUpdateThread 내에서 스프라이트를 분리하지 않는 것과 관련이 있다고 생각합니다.

**java.lang.IndexOutOfBoundsException: Invalid index 90, size is 90 
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257) 
at java.util.ArrayList.get(ArrayList.java:311) 
at org.anddev.andengine.entity.scene.Scene.onSceneTouchEvent(Scene.java:320)** 

두 질문 :

  1. 내가 재정의 onAreaTouched 사용하여 공을 서브 클래스 내에서 스프라이트의 제거를 처리하기 위해 수정, 또는 어떻게 든 (주요 활동에 다시 제거해야 있습니까 처음에 서브 클래스가 필요합니까?)

  2. unregisterTouchArea를 포함하면 IndexOutOfBoundsException이 발생하는 이유는 무엇입니까?

도움 주셔서 감사합니다.

답변

3

TouchListener에서 절대로 제거하지 마십시오. IUpdateHandler을 사용해야합니다.

1) 장면에 액세스 할 수있는 모든 곳에서 제거 작업을 수행 할 수도 있습니다.

2) TouchListener에서 제거를 수행하기 때문에 IndexOutOfBoundException이 발생합니다. 아마도 스프라이트를 제거하는 동안 새로운 방법이 장면에 추가 될 수 있습니다. UpdateHandler에 제거 기능을 추가하면이 문제가 해결됩니다.

+0

안녕하세요. 답장을 보내 주셔서 감사합니다. 나는 Ball 클래스에서 완전히 제거 할 수 있도록 onLoadScene에서 registerOnTouchArea를 사용해야한다는 것을 알았습니다. – Chris

0
/* 
     * Removing entities can only be done safely on the UpdateThread. Doing 
     * it while updating/drawing can cause an exception with a suddenly 
     * missing entity. Alternatively, there is a possibility to run the 
     * TouchEvents on the UpdateThread by default, by doing: 
     * engineOptions.getTouchOptions().setRunOnUpdateThread(true); when 
     * creating the Engine in onLoadEngine(); 
     */ 
     MainActivity.this.runOnUpdateThread(new Runnable() { 
      @Override 
      public void run() { 
       /* Now it is safe to remove the entity! */ 
       mScene.detachChild(face); 
      } 
     }); 
관련 문제