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

时间:2015-07-18 11:16:50

标签: c# xna collision-detection

我想让每个方面的平台对象都是实体,这样玩家就无法通过它。我认为最简单的想法是使用以前的位置"变量。特别是使用 Intersects()方法(我喜欢它)!

如果玩家相交,则移动到最后位置。但没有任何反应。我很可能无法弄清楚如何实施适当的"之前的位置"。

这是我在课堂上的所有内容:

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

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

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

我尝试的另一个想法是使用bool isSolid ,但我不知道如何使用逻辑。 我搜索并尝试了网上的事情(包括stackoverflow)可能需要4-5个小时。这应该是如此简单,但我无法理解!

1 个答案:

答案 0 :(得分:0)

答案很简单。看一下previousPosition,你就会发现问题。我会解释这个问题。

X是我当前的X•上一个X是我之前的X• •我在X轴向前移动,因此X增加1 •x现在为1 •prev X现在是x(所以它基本上是1)

x命中对象,因此x变为= prev X

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

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

简而言之就是订单

  • prevPos 设置为 playerPos
  • 移动播放器
  • currentPos 设置为 playerPos
  • 检查是否有碰撞
  • playerPos 设置为 prevPos 如果确实发生了冲突

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

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

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

this.Position = previousPosition;

如果这不起作用,还有另一种解决方案。此致,Tuukka。