使用 Intersects() 进行 XNA 碰撞检测

XNA Collision detection with Intersects()

我想从各个方向制作一个平台对象,这样玩家就无法通过它。我认为最简单的想法是使用 "previous position" 变量。特别是 Intersects() 方法(我喜欢)!

如果玩家相交,则移动到最后一个位置。但是没有任何反应。很可能我不知道如何实施正确的 "previous position".

这是我在 class 播放器中的内容:

public void Collision(Sprite obj)
    {
        Vector2 previousPosition = this.Position;
        if (this.Bounds.Intersects(obj.Bounds))
        {
            this.Position = previousPosition;
        }
    }

Player 和 Platform 继承 Sprite class 具有此 属性:

public Rectangle Bounds
{
    get
    {
       return new Rectangle((int)Position.X, (int)Position.Y,
                             Texture.Width, Texture.Height);
    }
}

我尝试的另一个想法是使用 bool isSolid 但我不知道如何处理逻辑。 我已经在网上(包括 Whosebug)搜索并尝试了 4-5 个小时。明明这么简单,我还是看不懂!

答案很简单。查看 previousPosition,您就会发现问题所在。我会这样解释这个问题。

X 是我现在的 X • Prev X 是我以前的 X • • 我在 X 轴上向前移动,所以 X 递增 1 • x 现在是 1 • prev X 现在是 x(所以基本上是 1)

x 击中物体所以 x 变成 = prev X

所以基本上 x 每次检查它是否击中目标时都会变成它自己。

解决方案一。 在移动之前将 previousPosition 变量设置为 currentPosition,因此 currentPosition 值发生变化并且 previousPosition 每次都与 currentPosition 不同。

总之就是这个顺序

  • prevPos设置为playerPos
  • 移动玩家
  • currentPos设置为playerPos
  • 检查碰撞
  • playerPos 设置为 prevPos 如果它们发生碰撞

编辑: 您提供的代码执行此操作:

PreviousPosition = this.Position;
this.Position = currentPosition;

第一行是正确的,但碰撞函数中的第二行需要更改为

this.Position = previousPosition;

如果这不起作用,还有其他解决方案。问候,图克卡。