C# Box2d:设置为活动和非活动
我正在使用Box2d-Box2dx的XNA端口用C#编写一个XNA游戏 树或僵尸等实体被表示为游戏对象C# Box2d:设置为活动和非活动,c#,xna,box2d,C#,Xna,Box2d,我正在使用Box2d-Box2dx的XNA端口用C#编写一个XNA游戏 树或僵尸等实体被表示为游戏对象GameObjectManager在游戏世界中添加和删除它们: /// <summary> /// Does the work of removing the GameObject. /// </summary> /// <param name="controller">The GameObject to be removed.
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);
}
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()
之前,已多次调用此方法。我觉得这可能把事情搞砸了。有几件事。错误实际上来自单个方法,因为它假定序列中至少有一项。如果您想要更宽容的行为,请使用SingleOrDefault,它将返回该类型的默认值(如果是类,则为null)
第二,“身体”对象。。。它可能重写了equals方法,在这种情况下,执行“==”时可能会得到奇数结果。如果您确实在寻找同一个实例(它是一个类),那么可以使用object.ReferenceEquals
方法
第三,你应该重新思考你的设计。任何时候,当您必须在集合中循环查找给定项时(这是所有的.Where方法),您都有机会使用更好的算法controller.Model.Body是box2d对象吗?
System.InvalidOperationException was unhandled
Message="Sequence contains no elements"
Source="System.Core"
StackTrace:
at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
at etc