使用 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;
如果这不起作用,还有其他解决方案。问候,图克卡。
我想从各个方向制作一个平台对象,这样玩家就无法通过它。我认为最简单的想法是使用 "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;
如果这不起作用,还有其他解决方案。问候,图克卡。