2012-10-22 25 views
5

AndEngine ile yeni oluyorum. Manzara modunda ekranın yukarısından gelen birçok yumurtlu sprite sahip bir sahne yarattım. Şimdi ona dokunduğumda bir sprite kaldırmak istiyorum. Sorun şu ki, ekrana dokunduğumda en son hareketli grafik kaldırıldı ve ben dokunmuş sprite'ı tek tek çıkaramıyorum. ekleyerek hedef içinDokunulduğunda sürekli yumurtlama sprite'ı çıkarın

//======== 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(); 

    } 
}; 

kod: dokundu kaldır sprite için

/** 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); 

} 

kod: Yeni sprite oluşturmak için GenericPool kullanmak

// ==============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(); 
} 

İşte benim kodudur.

Belirli dokunulan hareketli grafik için kod yazmam gereken yeri nereden sildiğimden emin değilim.

+0

@JhonEyer her yerde mi? –

cevap

1

ohh .. Burada çözümü buldum.

BaseGameActivity sınıfında bir IOnAreaTouchListener uyguladım. Yani, benim sınıf bildirimi gibi görünüyor:

public class CrazyMonkeyActivity extends BaseGameActivity implements 
    IOnAreaTouchListener 

ve benim geçersiz kılma yöntemi gibi görünür:

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

Ve gibi olmalı Sprite yöntemlerini kaldırın:

// ==============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(); 
     } 
    }); 
} 

oluşturmak için sürekli Spawn Sprite I Bu yöntemde bir zaman işleyici kullanın. Bu da başkalarına yardımcı olabilecek

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


} 

Umut: yöntemle Aşağıda onLoadScene içine çağrılmalıdır() yöntemi: gibi

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

Ve addTarget() görünüyor!