2012-10-22 11 views
5

Ich bin neu bei AndEngine. Ich habe gerade eine Szene mit vielen erzeugten Sprites erstellt, die im Querformat aus einer Höhe über dem Bildschirm kommen. Jetzt möchte ich ein Sprite entfernen, wenn ich es berühre. Problem ist, wenn ich den Bildschirm berührte, wird das letzte Sprite entfernt und ich kann das angezapfte Sprite nicht einzeln entfernen.Kontinuierliches Spawn-Sprite entfernen, wenn es berührt wird

Hier ist mein Code:

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

    } 
}; 

Code für das Hinzufügen Ziel:

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

} 

Code für Sprite entfernen, wenn sie berührt:

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

ich GenericPool verwenden, um neue Sprite zu erstellen.

Ich bin mir nicht sicher, wo ich Code für das spezifische berührte Sprite schreiben und es entfernen muss.

+0

@JhonEyer Sie alle? –

Antwort

1

ohh .. Ich habe die Lösung hier gefunden.

Ich habe einen IOnAreaTouchListener in der BaseGameActivity-Klasse implementiert. So sieht meine Klassendeklaration wie:

public class CrazyMonkeyActivity extends BaseGameActivity implements 
    IOnAreaTouchListener 

und meine Überschreibung Methode wie folgt aussieht:

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

Und Sprite Methoden entfernen sollte wie:

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

erstellen kontinuierliche Spawn Sprite I Verwenden Sie einen Zeithandler innerhalb dieser Methode. Unten Methode sollte innerhalb onLoadScene() -Methode aufgerufen werden:

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

Und addTarget() wie folgt aussieht:

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


} 

Hope this anderen auch helfen könnte!