2012-10-22 9 views
5

私はAndEngineで初めてです。私は、ランドスケープモードでスクリーンの高さの上から来る多くのスポーンされたスプライトを持つシーンを作成しました。今私はそれに触れるときスプライトを削除したいと思います。問題は、私が画面に触れたときに、最新のスプライトが削除され、タップされたスプライトを個別に削除できないということです。追加するターゲットのタッチ時に連続スポーンスプライトを削除します。

//======== TimerHandler for collision detection and cleaning up ====== 
IUpdateHandler detect = new IUpdateHandler() { 
    @Override 
    public void reset() { 
    } 

    @Override 
    public void onUpdate(float pSecondsElapsed) { 

     targets = targetLL.iterator(); 
     while (targets.hasNext()) { 
      _target = targets.next(); 

      if (_target.getY() >= cameraHeight) { 
       // removeSprite(_target, targets); 
       tPool.recyclePoolItem(_target); 
       targets.remove(); 
       Log.d("ok", "---------Looop Inside-----"); 
       // fail(); 
       break; 

      } 
      // i don't know whether below code is valid for this postion 
      mMainScene.setOnSceneTouchListener(new IOnSceneTouchListener() { 
      @Override 
       public boolean onSceneTouchEvent(Scene arg0, 
         TouchEvent pSceneTouchEvent) { 

        try { 
         // i can't use this two 
         final float touchX = pSceneTouchEvent.getX(); 
         final float touchY = pSceneTouchEvent.getY(); 

         if (pSceneTouchEvent.getAction() == TouchEvent.ACTION_DOWN) { 
          //call to remove sprite 
          removeSprite(_target, targets); 
         } 
        } catch (ArrayIndexOutOfBoundsException e) { 
         e.printStackTrace(); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
        return true; 
       } 
      }); 
     } 
     targetLL.addAll(TargetsToBeAdded); 
     TargetsToBeAdded.clear(); 

    } 
}; 

コード:触れ削除スプライトの

/** adds a target at a random location and let it move along the y-axis */ 
public void addTarget() { 
    Random rand = new Random(); 

    int minX = mTargetTextureRegion.getWidth(); 
    int maxX = (int) (mCamera.getWidth() - mTargetTextureRegion.getWidth()); 
    int rangeX = maxX - minX; 
    Log.d("----point----", "minX:" + minX + "maxX:" + maxX + "rangeX:" 
      + rangeX); 

    int rX = rand.nextInt(rangeX) + minX; 
    int rY = (int) mCamera.getHeight() + mTargetTextureRegion.getHeight(); 

    Log.d("---Random x----", "Random x" + rX + "Random y" + rY); 

    //HERE I USE POOL TO CREATE NEW SPRITE 
    //tPool is object of TargetsPool Class 
    target = tPool.obtainPoolItem(); 
    target.setPosition(rX, rY); 

    target.animate(100); 
    mMainScene.attachChild(target, 1); 
    mMainScene.registerTouchArea(target); 

    int minDuration = 2; 
    int maxDuration = 32; 
    int rangeDuration = maxDuration - minDuration; 
    int actualDuration = rand.nextInt(rangeDuration) + minDuration; 

    // MoveXModifier mod = new MoveXModifier(actualDuration, target.getX(), 
    // -target.getWidth()); 

    MoveYModifier mody = new MoveYModifier(actualDuration, 
      -target.getHeight(), cameraHeight + 10); 
    target.registerEntityModifier(mody.deepCopy()); 
    TargetsToBeAdded.add(target); 

} 

コード:私は新しいスプライトを作成するためにGenericPoolを使用

// ==============the method to remove sprite===================== 
public void removeSprite(final AnimatedSprite _sprite, Iterator it) { 
    runOnUpdateThread(new Runnable() { 

     @Override 
     public void run() { 
      _target = _sprite; 
      mMainScene.detachChild(_target); 
     } 
    }); 
    it.remove(); 
} 

は、ここに私のコードです。

特定のタッチされたスプライトのどこにコードを記述して削除する必要があるのか​​わかりません。

+0

@JhonEyer u there there? –

答えて

1

ohh ..ここで解決策が見つかりました。

私はBaseGameActivityクラスにIOnAreaTouchListenerを実装しました。だから、私のクラス宣言は次のようになります。

public class CrazyMonkeyActivity extends BaseGameActivity implements 
    IOnAreaTouchListener 

と私のオーバーライドメソッドは、次のようになります。連続スポーンスプライトIを作成するには

// ==============the method to remove spirit===================== 
public void removeSprite(final AnimatedSprite target) { 
    runOnUpdateThread(new Runnable() { 
     @Override 
     public void run() { 
      mMainScene.detachChild(target); 
      mMainScene.unregisterTouchArea(target); 
      System.gc(); 
     } 
    }); 
} 

@Override 
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, 
     final ITouchArea pTouchArea, final float pTouchAreaLocalX, 
     final float pTouchAreaLocalY) { 

    if (pSceneTouchEvent.isActionDown()) { 
     this.removeSprite((AnimatedSprite) pTouchArea); 
     return true; 
    } 

    return false; 
} 

スプライトメソッドを削除するようにする必要がありこのメソッド内でタイムハンドラを使用します。法の下にはonLoadScene()メソッドの内部で呼び出さなければなりません:これはあまりにも他人を助けるかもしれない

public void addTarget(float xPos, float yPos) { 
    Random rand = new Random(); 
    Log.d("---Random x----", "Random x" + xPos + "Random y" + yPos); 

    target = new AnimatedSprite(xPos, yPos, mTargetTextureRegion); 
    target.animate(100); 
    mMainScene.attachChild(target); 
    mMainScene.registerTouchArea(target); 

    int minDuration = 2; 
    int maxDuration = 32; 
    int rangeDuration = maxDuration - minDuration; 
    int actualDuration = rand.nextInt(rangeDuration) + minDuration; 

    MoveYModifier mody = new MoveYModifier(actualDuration, 
      -target.getHeight(), cameraHeight + 10); 
    target.registerEntityModifier(mody.deepCopy()); 


} 

希望:

/** a Time Handler for spawning targets Sprites, triggers every 2 second */ 
private void createSpriteSpawnTimeHandler() { 
    TimerHandler spriteTimerHandler; 
    float mEffectSpawnDelay = 2f; 

    spriteTimerHandler = new TimerHandler(mEffectSpawnDelay, true, 
      new ITimerCallback() { 
       @Override 
       public void onTimePassed(TimerHandler pTimerHandler) { 
         //position for random sprite 
        final float xPos = MathUtils.random(30.0f, 
          (cameraWidth - 30.0f)); 
        final float yPos = MathUtils.random(30.0f, 
          (cameraHeight - 30.0f)); 
        //below method call for new sprite 
        addTarget(xPos, yPos); 

       } 

      }); 
    getEngine().registerUpdateHandler(spriteTimerHandler); 
} 

とaddTarget()のように見えます!

関連する問題