gpt4 book ai didi

c# - 用于碰撞检测的边界框重叠并导致问题

转载 作者:太空宇宙 更新时间:2023-11-03 13:39:22 26 4
gpt4 key购买 nike

以下代码是我试图阻止 PC(玩家角色)穿过 NPC。

  • “if”语句检查两个矩形 (BoundingBox) 是否相交。
  • collisionBox 定义重叠边界框的区域
  • moveDir 定义了在 if 语句之后 PC 将经历的 Vector 变化(例如:如果 moveDir=(2,0) PC 将向右移动两个像素)
  • currentSpeed 根据键盘输入(上、下、左、右)定义分配给 moveDir.X 或 moveDir.Y 的值

代码:

if (PC.charSprite.BoundingBox.Intersects(npc.charSprite.BoundingBox))       
{
Rectangle collisionBox = Rectangle.Intersect(PC.charSprite.BoundingBox, npc.charSprite.BoundingBox);

if (PC.moveDir.X > 0) //Moving Right
{
//Unknown Code Goes Here
}
else if (PC.moveDir.X < 0) //Moving Left
{

}
else if (PC.moveDir.Y > 0) //Moving Down
{

}
else if (PC.moveDir.Y < 0) //Moving Up
{

}
}

我如何做到当 PC 接触到 NPC 时,PC 停止朝那个方向移动但可以自由移动其他三个方向中的任何一个?

我试过的代码:

if (PC.moveDir.X > 0) //Moving Right
{
PC.moveDir = Vector2.Zero;
}
else if (PC.moveDir.X < 0) //Moving Left
{
PC.moveDir = Vector2.Zero;
}
else if (PC.moveDir.Y > 0) //Moving Down
{
PC.moveDir = Vector2.Zero;
}
else if (PC.moveDir.Y < 0) //Moving Up
{
PC.moveDir = Vector2.Zero;
}

^这会将 PC 锁定到位,防止任何和所有移动。

if (PC.moveDir.X > 0) //Moving Right
{
PC.moveDir.X = 0;
}
else if (PC.moveDir.X < 0) //Moving Left
{
PC.moveDir.X = 0;
}
else if (PC.moveDir.Y > 0) //Moving Down
{
PC.moveDir.Y = 0;
}
else if (PC.moveDir.Y < 0) //Moving Up
{
PC.moveDir.Y = 0;
}

^这也将 PC 锁定到位。

if (PC.moveDir.X > 0) //Moving Right
{
PC.moveDir.X = -currentspeed;
}
else if (PC.moveDir.X < 0) //Moving Left
{
PC.moveDir.X = currentspeed;
}
else if (PC.moveDir.Y > 0) //Moving Down
{
PC.moveDir.Y = -currentspeed;
}
else if (PC.moveDir.Y < 0) //Moving Up
{
PC.moveDir.Y = currentspeed;
}

^这在非常间歇性的基础上工作。我曾希望通过将 moveDir 更改为与其重叠(或更大)多少的相反方向,将使 PC 保持在 NPC 的边缘但防止重叠。不幸的是,有一半时间 PC 卡在原地。

结合两者

if (PC.moveDir.X > 0) //Moving Right
{
PC.moveDir.X = -currentspeed;
PC.moveDir.X = 0;
}
else if (PC.moveDir.X < 0) //Moving Left
{
PC.moveDir.X = currentspeed;
PC.moveDir.X = 0;
}
else if (PC.moveDir.Y > 0) //Moving Down
{
PC.moveDir.Y = -currentspeed;
PC.moveDir.Y = 0;
}
else if (PC.moveDir.Y < 0) //Moving Up
{
PC.moveDir.Y = currentspeed;
PC.moveDir.Y = 0;
}

只是导致整体锁定。

if (PC.moveDir.X > 0) //Moving Right
{
PC.moveDir.X = -collisionBox.Width;
}
else if (PC.moveDir.X < 0) //Moving Left
{
PC.moveDir.X = collisionBox.Width;
}
else if (PC.moveDir.Y > 0) //Moving Down
{
PC.moveDir.Y = -collisionBox.Height;
}
else if (PC.moveDir.Y < 0) //Moving Up
{
PC.moveDir.Y = collisionBox.Height;
}

^这几乎工作得很好,但是当 PC 面对 NPC 并垂直于它接触的 NPC 时,PC 会跳到一边。同样,大约一半的时间。

受 CSJ 评论启发的尝试:

if (PC.charSprite.BoundingBox.Intersects(npc.charSprite.BoundingBox))
{
Rectangle collisionBox = Rectangle.Intersect(PC.charSprite.BoundingBox, npc.charSprite.BoundingBox);
if (PC.moveDir.X > 0) //Moving Right
{
PC.charSprite.Position = new Vector2(npc.charSprite.BoundingBox.Left - 34, PC.charSprite.Position.Y);
}
else if (PC.moveDir.X < 0) //Moving Left
{
PC.charSprite.Position = new Vector2(npc.charSprite.BoundingBox.Right + 2, PC.charSprite.Position.Y);
}
else if (PC.moveDir.Y > 0) //Moving Down
{
PC.charSprite.Position = new Vector2(PC.charSprite.Position.X, npc.charSprite.BoundingBox.Top - 34);
}
else if (PC.moveDir.Y < 0) //Moving Up
{
PC.charSprite.Position = new Vector2(PC.charSprite.Position.X, npc.charSprite.BoundingBox.Bottom + 2)
}
}

我再问:如何让PC碰到NPC时,PC停止向那个方向移动,但可以自由移动其他三个方向?

或者,用更一般的术语来说,我如何使一个与另一个矩形相交的矩形失去其向它相交的矩形移动的能力,而不妨碍它在任何其他方向上的移动?

最佳答案

我在这种情况下所做的是:

  • 正常进行位移(即把角色的运动向量加到他的位置上)
  • 检查所有障碍物是否发生碰撞。如果发生碰撞,将角色“传送”远离障碍物,比方说,一个像素。继续这样做,直到不再发生碰撞。

它可能不是运行速度最快的解决方案,但它可以完成工作。当有许多动态事物也可能发生碰撞时效果很好。

关于c# - 用于碰撞检测的边界框重叠并导致问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17666507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com