我正在使用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();
}
感謝指針我會給它一個嘗試:)它可能值得注意我認爲代碼已經從'textureRegion.clone()'更改爲'textureRegion.deepCopy()'(至少這就是它看起來的樣子就像在我認爲是最新版本的andengine版本中一樣:S) – AndroidNoob
看起來像'textureRegion.deepCopy()'做了訣竅:)再次感謝指針! – AndroidNoob
@AndroidNoob,不客氣!似乎我需要更新我的AndEngine庫! =) – Egor