2012-03-02 3 views
3

항목을 클릭하면 본문을 제거하고 싶습니다. 보시다시피 벽 고정 장치로 설정했습니다. 항목이 스프라이트를 클릭 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

I (나는 단순히 문제를 :)에 맞게 만들려고) 확실하지 오전하지만 난 당신이 스프라이트를 확장하고 클래스 내부에 몸 변수를 선언하는 것이 좋습니다 몸과 스프라이트 사이의 연결 상태가 좋음을 모든 기관

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

확실하지 않지만 먼저 제거해야하는 항목이나 개체에 플래그를 지정해야한다고 생각합니다. 그런 다음 게임이 업데이트되면 모든 개체를 거쳐 플래그가 지정된 개체를 확인한 다음 제거해야합니다. 나도이 새로운 합니다만 여기에 아무것도 간다 : 먼저 IUpdateHandler과 같이하는 것입니다

그래서 좋은 방법은 AndEngine에서이 작업을 수행하지 않으려면 :

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

관련 문제