2011-09-09 32 views
0

我正在使用Andengine/Box2D物理插件製作遊戲。我經歷了在世界步驟計算過程中由於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; 
} 

然後在更新線程遍歷所有在我的世界裏尋找這些標誌的機構,並刪除與精靈/機構旗。正文刪除正確,但刪除精靈似乎刪除該特定精靈的每個實例,而不是僅刪除我標記爲刪除的特定的一個!我可以告訴身體在沒有精靈的情況下仍然存在,因爲我的球員與無形的物體發生碰撞!這裏是刪除代碼:

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,所以當一個精靈的區域發生變化時 - 其他精靈的相同區域也會因Android體系結構細節而發生變化。對於每個具有相同TextureRegion的精靈,您應該使用textureRegion.clone()作爲構造函數的最後一個參數。希望這可以幫助。

+0

感謝指針我會給它一個嘗試:)它可能值得注意我認爲代碼已經從'textureRegion.clone()'更改爲'textureRegion.deepCopy()'(至少這就是它看起來的樣子就像在我認爲是最新版本的andengine版本中一樣:S) – AndroidNoob

+0

看起來像'textureRegion.deepCopy()'做了訣竅:)再次感謝指針! – AndroidNoob

+0

@AndroidNoob,不客氣!似乎我需要更新我的AndEngine庫! =) – Egor