2

我正在使用 Farseer 3.3 和 XNA。

我有一个问题,我无法很好地解决。

我有一种情况,有一个世界,里面有身体,所有的东西都在工作。

然后我有一个对象,它的身体设置为未启用,有没有一种很好的方法来检查身体当前是否与任何东西发生碰撞?即知道它是否会是一个干净的产卵,我应该启用它并将其设置为动态吗?

提前致谢。

4

1 回答 1

2

对于其他在尝试解决同类问题时发现这篇文章的人来说,我最终是如何做到的。

在这个例子中,我使用单词 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。

于 2011-08-30T17:54:06.530 回答