2012-02-19 9 views
3

私は、画面の周りをランダムに跳ね返るたくさんのボールスプライトを作成しています。触ったとき、私はボールを場から取り除きたい。 (複数のボールが同じスペースを占めている場合、現時点ではそれも削除されます)。Andengineを使って安全にスプライトを削除する

私は私のボールスプライトサブクラス内、私はonAreaTouchedオーバーライドすることにより、タッチにdetachChildのでscene.detachChildは、runOnUpdateThread上で実行する必要があります実現:

 @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.is)行のコメントを外すと、タッチに作用するスプライトを停止することができます(これは削除には影響しませんが、処理中のタッチを止める方が良いと思った場合)。私が考えている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

こんにちは、ありがとうございました。私はonLoadSceneでregisterOnTouchAreaを使用する必要があることに気づき、Ballクラスから完全に取り除くことができます。 – 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); 
      } 
     }); 
関連する問題