2012-10-22 15 views
5

Sono nuovo con AndEngine. Ho appena creato una scena con molti sprite generati che provengono da un'altezza dello schermo superiore in modalità orizzontale. Ora voglio rimuovere uno sprite quando tocco su di esso. Il problema è che quando ho toccato lo schermo è stato rimosso lo sprite più recente e non riesco a rimuovere lo sprite toccato individualmente.Rimuovi sprite spawn continuo quando viene toccato

Ecco il mio codice:

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

    } 
}; 

per obiettivo l'aggiunta:

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

} 

per rimuovere sprite quando viene toccato:

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

Io uso GenericPool per creare nuovi sprite.

Non sono sicuro di dove devo scrivere il codice per lo sprite specifico toccato e rimuoverlo.

+0

@JhonEyer tutti lì? –

risposta

1

ohh .. Ho trovato la soluzione qui.

Ho implementato un IOnAreaTouchListener nella classe BaseGameActivity. Quindi, la mia dichiarazione di classe si presenta come:

public class CrazyMonkeyActivity extends BaseGameActivity implements 
    IOnAreaTouchListener 

e il mio metodo di sostituzione appare come:

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

e rimuovere metodi Sprite dovrebbe essere come:

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

Per creare continuo Spawn Sprite I utilizzare un gestore di tempo all'interno di questo metodo. Metodo Di seguito il metodo dovrebbe essere chiamato all'interno onLoadScene():

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

E addTarget() appare come:

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


} 

Spero che questo potrebbe aiutare gli altri troppo!

Problemi correlati