2012-03-02 37 views
3

我想在點擊該項目時刪除身體。正如你所看到的,我將它設置爲wallfixture。AndEngine - 刪除特定的Sprite及其身體

當物品被點擊精靈被刪除,現在我只是想清除體內也..

public void addSprites(Scene scene, int x,int y,int width,int height,String type,Body body){ 
    Sprite sprite = null; 

    if(type.equals(TAG_ENTITY_ATTRIBUTE_TYPE_VALUE_WOOD)) { 
     sprite = new Sprite(x, y, width, height, this.wood, this.getVertexBufferObjectManager()){ 
      @Override 
      public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { 
       mScene.detachChild(this); 
       mPhysicsWorld.destroyBody(woodBody); 
       return true; 
      } 

     }; 
      final FixtureDef wallFixtureDef = PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f); 
      woodBody = PhysicsFactory.createBoxBody(this.mPhysicsWorld, sprite, BodyType.StaticBody, wallFixtureDef); 
      mScene.registerTouchArea(sprite); 
     Log.e("TYPE", "Wood"); 
    } 
    scene.attachChild(sprite); 
      } 

什麼,我想要做的就是在單擊項目時我想刪除精靈&它附着的身體。代碼我有工作,但唯一的問題是它刪除了所有的身體,我使用該方法附加物品到一個級別,所以它共有3個項目,當點擊一個時,身體從所有的精靈中刪除,當它應該只是一個點擊。

任何人都知道如何去做這件事?

回答

8

我我不知道,但可能是是因爲你使用相同的變量所有機構

woodBody = PhysicsFactory.createBoxBody(this.mPhysicsWorld, sprite, BodyType.StaticBody, wallFixtureDef); 

做全身和精靈之間的良好連接,我建議您擴展雪碧和聲明你的類體內變量。比如我做那樣的

public class Ball extends Sprite{ 

final FixtureDef ballFixtureDef = PhysicsFactory.createFixtureDef(1.0f, 0.0f, 0.0f, false, Main.CATEGORYBIT_BALL, Main.MASKBITS_BALL, (short)0); 

Body body; 
float velocityX, velocityY; 
int type; 

public Ball(float pX, float pY, TextureRegion pTextureRegion, PhysicsWorld pWorld, float velocityX, float velocityY, int type) 
{ 
    super(pX, pY, pTextureRegion); 
    this.type = type; 
    this.velocityX = velocityX; 
    this.velocityY = velocityY; 
    body = PhysicsFactory.createCircleBody(pWorld, this, BodyType.DynamicBody, ballFixtureDef); 
    body.setUserData(Ball.this); 
    pWorld.registerPhysicsConnector(new PhysicsConnector(this, body, true, true)); 
} 
} 

和破壞精靈與身體

private void destroyBall(final Ball ball) 
    { 
     this.runOnUpdateThread(new Runnable(){ 

      @Override 
      public void run() { 

       final Body body = ball.body; 
       mPhysicsWorld.unregisterPhysicsConnector(mPhysicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(ball)); 
       mPhysicsWorld.destroyBody(body); 
       mScene.detachChild(ball); 
       ballsList.remove(ball); 
      }}); 

    } 

,你只要以這種方式

Ball b = new Ball(float pX, float pY, TextureRegion pTextureRegion, PhysicsWorld pWorld, float velocityX, float velocityY, int type) 
{ 
    @Override 
    public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) 
    { 
     destroyBall(this); 
    } 
} 
創建對象的方法
2

我並不確定,但我認爲您需要標記需要先移除的項目或對象。然後當遊戲更新它應該通過所有的對象,並檢查哪些標記,然後刪除它們。我是新來這也但這裏不用什麼:

所以一個好辦法,在AndEngine做,這是第一個做出IUpdateHandler像這樣:

/** 
* This wil get called every frame and is placed inside of your 
* main game activity or where ever you want. 
**/ 
public IUpdateHandler getCollisionUpdateHandler(){ 

    return new IUpdateHandler(){ 

     @Override 
     public void onUpdate(float pSecondsElapsed) { 

      // loop through all of your sprites 
      for(int i=0; i<GameActivity.this.spriteList.length; i++) { 

        //if sprite is flagged for deletion, begin removal 
        if(GameActivity.this.spriteList.get(i).isDelete()){ 
         // get the next sprite to delete 
         final mSprite Object = GameActivity.this.spriteList.get(i); 
         // can remove it from the list now 
         Game.this.spriteList.remove(i); 

         final Scene scene = GameActivity.this.mEngine.getScene(); 
         final Body body = GameActivity.this.mPhysicsWorld.getPhysicsConnectorManager().findBodyByShape(Object); 
         mPhysicsWorld.destroyBody(body); 
         //scene.getLayer(0).removeEntity(Object); 
         //scene.getLayer(1).removeEntity(Object); 
         scene.detachChild(Object); 
        } 
       } 
      } 
     } 
} 

然後只需註冊一個更新處理。像這樣:

mScene.registerUpdateHandler(this.getCollisionUpdateHandler()); 

所以,現在,每當你想刪除一個精靈(當它按下),那麼你只需改變你的方法:

@Override 
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { 
    MainActivity.spriteList.add(this); 
    this.delete = true; 
    return true; 
} 

希望有所幫助。這裏就是我從得到它:(我只是試圖使它適合您的問題:))

www.andengine.org/forums/tutorials/box2d-collision-and-removal-t523.html