我正在使用 Box2d - Box2dx 的 XNA 端口用 C# 编写 XNA 游戏。
像树或僵尸这样的实体被表示为游戏对象。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);
}
世界查询工具:
// 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()
。我觉得这可能搞砸了。