我正在使用Farseer 3.3和XNA。
我有一个问题,我不能以一种很好的方式解决。
我有一种情况,那里有一个身体的世界都在努力做那件事。
然后我有一个对象,即身体设置为未启用,是否有一种很好的方法来检查身体当前是否与任何东西发生碰撞?即要知道它是否是一个干净的产卵,我应该启用并将其设置为动态吗?
提前致谢。
答案 0 :(得分:2)
对于其他人在尝试解决同类问题的同时找到这篇文章,我最终是如何做到的。
在这个例子中,我使用单词Item来表示包含body等的类,这可能是你的player / bullet / whatever。
在您的Item类中,订阅碰撞和分离事件上的实体。
this.Body.OnCollision += Body_OnCollision;
this.Body.OnSeparation += Body_OnSeperation;
然后设置该项目的成员以保留碰撞和分离计数。
private int _canBePlacedCounter = 0;
在事件处理程序方法上,增加减少成员数。在下面的代码中,我有额外的条件,我只想在项目被放入“世界”时执行这些操作。
private bool Body_OnCollision(Fixture fixturea, Fixture fixtureb, Contact contact)
{
if(this.IsBeingPlaced)
{
_canBePlacedCounter++;
}
return true;
}
private void Body_OnSeperation(Fixture fixturea, Fixture fixtureb)
{
if (this.IsBeingPlaced)
{
_canBePlacedCounter--;
}
}
然后我们可以设置一个简单的公共属性(如果我们想要进入编码标准,这应该是一种方法,但这不是时间或地点)
public bool CanBeDropped
{
get
{
if (_canBePlacedCounter == 0) return true;
else return false;
}
}
这个实现的原因是,我最初有一个bool,当我得到其中一个事件时,我设置为true或false。问题是......如果您的项目与项目A发生碰撞,则与项目B发生碰撞,然后离开项目A,您将获得不发生碰撞的读数。所以......使用这样的计数器,我们可以计算并计算所有的碰撞和分离。相信我,这就像一个绝对的魅力。
希望它对那里的人有用。
更新:我发现这只适用于基本矩形。如果您进入具有许多多边形的物体,例如从图像自动生成的多边形,则其非常不可靠,因为无论何种原因,farseer定期引发的分离事件少于碰撞事件,这意味着计数器通常不会返回到0。