2012-10-22 37 views
5

Jestem nowy z AndEngine. Właśnie stworzyłem scenę z wieloma zrodzonymi duszkami, które pochodzą z powyższej wysokości ekranu w trybie poziomym. Teraz chcę usunąć ikonkę, gdy ją dotknę. Problem polega na tym, że kiedy dotknąłem ekranu, najnowszy duszek zostanie usunięty i nie mogę go osobno usunąć.Usuń powtarzający się sprite po dotknięciu

Oto mój kod:

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

    } 
}; 

do dodawania cel:

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

} 

dla remove ikonki przy dotknięciu:

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

używam GenericPool tworzyć nowe ikonki.

Nie jestem pewien, gdzie muszę napisać kod dla konkretnego dotkniętego duszka i go usunąć.

+0

@JhonEyer u wszystkich tam? –

Odpowiedz

1

ohh .. Znalazłem rozwiązanie tutaj.

Zaimplementowałem IOnAreaTouchListener w klasie BaseGameActivity. Tak, moja deklaracja klasy wygląda następująco:

public class CrazyMonkeyActivity extends BaseGameActivity implements 
    IOnAreaTouchListener 

i moja metoda przesłanianie wygląda następująco:

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

i usunąć metodami Sprite powinno być tak:

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

Aby utworzyć ciągły Spawn Sprite I użyj metody obsługi czasu w tej metodzie. Poniżej metody powinny być nazywane wewnątrz onLoadScene() metoda:

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

I addTarget() wygląda następująco:

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


} 

Nadzieja to może pomóc innym też!

Powiązane problemy