2011-09-09 1 views
0

Andengine/Box2D physics addon을 사용하여 게임을 만들고 있습니다. 전 세계 단계 계산 중에 box2d 본문의 추가/이동/삭제로 인해 임의의 충돌이 발생했습니다. 따라서 setUserData 메소드를 사용하여 제거를 위해 스프라이트/본문을 플래그 지정하는 코드를 구현했습니다. 각 본문에 JSON 객체를 첨부하고 스프라이트AndEngine Sprite/Box2D 본문 제거는 마디 부 바디를 제거하지만, 스프라이트의 모든 인스턴스를 제거합니까?

private JSONObject makeUserData(int type, Body body, Object sprite) 
{ 
    JSONObject myObject = new JSONObject(); 

    try { 
     myObject.put("type", type); 
     myObject.put("sprite", sprite); 
     myObject.put("body", body); 
     myObject.put("deleteStatus", false); 
    } catch (JSONException e) { 
     Log.d(TAG,"Exception creating user data:"+e); 
    } 
    return myObject; 
} 

다음 업데이트 스레드에서 이러한 플래그를 찾고 내 세상의 모든 기관을 통해 반복과 함께 스프라이트/몸을 삭제 : 스프라이트의 종류, 본문 및 스프라이트 자체의 삭제 상태를 포함 깃발. 바디가 올바르게 제거되지만, 스프라이트 제거는 제거하기 위해 플래그가 지정된 특정 부품을 제거하는 것보다 그 particluar 스프라이트의 모든 인스턴스를 삭제하는 것처럼 보입니다! 내 플레이어가 보이지 않는 물건과 충돌 할 때 시체가 스프라이트없이 여전히 존재한다고 말할 수 있습니다! 다음은 코드를 제거하는 코드입니다.

private void removeObjectsSetForDestruction() 
{ 
    if(this.mPhysicsWorld!=null) 
    { 
     Iterator<Body> allMyBodies = this.mPhysicsWorld.getBodies(); 
     boolean isDelete = false; 
     JSONObject currentBodyData; 
     while(allMyBodies.hasNext()) 
     { 
      try { 
       currentBodyData = (JSONObject)allMyBodies.next().getUserData(); 
       if(currentBodyData!=null) 
       { 
        isDelete = (Boolean) currentBodyData.get("deleteStatus"); 
        if(isDelete) 
        { 
         destroyObstruction((Body) currentBodyData.get("body")); 
        } 
       } 
      } catch (JSONException e) { 
       Log.d(TAG,"Error getting world bodies data:"+e); 
      } 
     } 
    } 
} 

private void destroyObstruction(Body obstructionBody) throws JSONException 
{ 
    obstructionBody.setActive(false); 

     JSONObject secondBodyData = null; 
     if(obstructionBody.getUserData()!=null) 
     { 
      secondBodyData=(JSONObject) obstructionBody.getUserData(); 

      //explodeObstruction(((IEntity) secondBodyData.get("sprite")).getX(),((IEntity) secondBodyData.get("sprite")).getY()); 
      if(secondBodyData.get("sprite") instanceof AnimatedSprite) 
      { 
       removeObject((AnimatedSprite) secondBodyData.get("sprite")); 
      } 
      else 
      { 
       removeObject((Sprite) secondBodyData.get("sprite")); 
      } 
     } 


} 

private void removeObject(final AnimatedSprite myAnimSprite) 
{ 
    final PhysicsConnector myPhysicsConnector = this.mPhysicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(myAnimSprite); 

    this.mPhysicsWorld.unregisterPhysicsConnector(myPhysicsConnector); 
    this.mPhysicsWorld.destroyBody(myPhysicsConnector.getBody()); 

    this.mScene.unregisterTouchArea(myAnimSprite); 
    this.mScene.detachChild(myAnimSprite); 

    System.gc(); 
} 

private void removeObject(final Sprite mySprite) 
{ 
    final PhysicsConnector myPhysicsConnector = this.mPhysicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(mySprite); 

    this.mPhysicsWorld.unregisterPhysicsConnector(myPhysicsConnector); 
    this.mPhysicsWorld.destroyBody(myPhysicsConnector.getBody()); 

    this.mScene.unregisterTouchArea(mySprite); 
    this.mScene.detachChild(mySprite); 

    System.gc(); 
} 

답변

1

코드를 만드는 개체를 살펴보고 싶습니다. 나는 모든 스프 라이트가 같은 TextureRegion을 사용한다고 가정한다. 그래서 한 스프라이트의 영역이 변경 될 때 - 다른 스프라이트의 동일한 영역도 안드로이드 아키텍처의 특성으로 인해 변경된다. TextureRegion이 같은 모든 스프라이트에 대해서는 textureRegion.clone()을 생성자의 마지막 매개 변수로 사용해야합니다. 희망이 도움이됩니다.

+0

포인터를 주셔서 감사합니다. 시도해 보겠습니다. 코드가'textureRegion.clone()'에서'textureRegion.deepCopy()'(적어도 보이는 것)로 변경되었다고 생각됩니다. S) – AndroidNoob

+0

'textureRegion.deepCopy()'처럼 보이기 때문에 트릭을 마쳤습니다. 포인터에 다시 한번 감사드립니다! – AndroidNoob

+0

@AndroidNoob, 아무쪼 락! AndEngine 라이브러리를 업데이트해야합니다! =) – Egor

관련 문제