我正在使用 Farseer 3.3 和 XNA。
我有一个问题,我无法很好地解决。
我有一种情况,有一个世界,里面有身体,所有的东西都在工作。
然后我有一个对象,它的身体设置为未启用,有没有一种很好的方法来检查身体当前是否与任何东西发生碰撞?即知道它是否会是一个干净的产卵,我应该启用它并将其设置为动态吗?
提前致谢。
我正在使用 Farseer 3.3 和 XNA。
我有一个问题,我无法很好地解决。
我有一种情况,有一个世界,里面有身体,所有的东西都在工作。
然后我有一个对象,它的身体设置为未启用,有没有一种很好的方法来检查身体当前是否与任何东西发生碰撞?即知道它是否会是一个干净的产卵,我应该启用它并将其设置为动态吗?
提前致谢。
对于其他在尝试解决同类问题时发现这篇文章的人来说,我最终是如何做到的。
在这个例子中,我使用单词 Item 来表示包含身体等的类,这可能是你的播放器/子弹/任何东西。
在您的 Item 类中订阅碰撞和分离事件的主体。
this.Body.OnCollision += Body_OnCollision;
this.Body.OnSeparation += Body_OnSeperation;
然后为该项目设置一个成员来保存碰撞和分离的计数。
私人 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;
}
}
这个实现的原因是,我最初有一个布尔值,每当我得到一个事件时,我都会将其设置为 true 或 false。问题是……如果您的项目与项目 A 发生碰撞,然后与项目 B 发生碰撞,然后离开项目 A,您会得到未碰撞的读数。所以......使用这样的计数器,我们可以计算和计算所有的碰撞和分离。相信我,这就像一个绝对的魅力。
希望它对那里的人有用。
更新:我发现这只适用于基本矩形。如果您进入具有许多多边形的主体,例如从图像自动生成的多边形,则它非常不可靠,因为无论出于何种原因,farseer 经常引发的分离事件少于碰撞事件,这意味着计数器通常不会返回 0。