我正在使用Box2d - Box2dx的XNA端口在C#中編寫XNA遊戲。Box2d:設置活動和不活動
樹木或殭屍等實體表示爲GameObjects。 GameObjectManager
增加,並從遊戲世界中將其刪除:
/// <summary>
/// Does the work of removing the GameObject.
/// </summary>
/// <param name="controller">The GameObject to be removed.</param>
private void removeGameObjectFromWorld(GameObjectController controller)
{
controllers.Remove(controller);
worldState.Models.Remove(controller.Model);
controller.Model.Body.SetActive(false);
}
public void addGameObjectToWorld(GameObjectController controller)
{
controllers.Add(controller);
worldState.Models.Add(controller.Model);
controller.Model.Body.SetActive(true);
}
controllers
是GameObjectController
實例的集合。
worldState.Models
是GameObjectModel
實例的集合。
當我從Box2D中刪除GameObjects這種方式,這種方法被稱爲:
void IContactListener.EndContact(Contact contact)
{
GameObjectController collider1 = worldQueryUtils.gameObjectOfBody(contact.GetFixtureA().GetBody());
GameObjectController collider2 = worldQueryUtils.gameObjectOfBody(contact.GetFixtureB().GetBody());
collisionRecorder.removeCollision(collider1, collider2);
}
worldQueryUtils:
// this could be cached if we know bodies never change
public GameObjectController gameObjectOfBody(Body body)
{
return worldQueryEngine.GameObjectsForPredicate(x => x.Model.Body == body).Single();
}
此方法將引發錯誤:
System.InvalidOperationException was unhandled
Message="Sequence contains no elements"
Source="System.Core"
StackTrace:
at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
at etc
爲什麼這是否發生?我能做些什麼來避免它?在調用body.SetActive()
之前,此方法已被調用很多次。我覺得這可能會搞砸了。
是controller.Model.Body一個box2d對象? – HyperCas 2010-04-07 15:55:58
這完全正確。 – 2010-04-07 16:55:54