以下代码是我试图阻止 PC(玩家角色)穿过 NPC 的尝试。
- “if”语句检查两个矩形(BoundingBox)是否相交。
- 碰撞框定义重叠边界框的区域
- moveDir 定义了在 if 语句之后 PC 将经历的矢量变化(例如:如果 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 停止朝那个方向移动,但可以自由移动其他三个方向中的任何一个?
或者,用更通用的术语来说,我如何使一个与另一个 Rectangle 相交的 Rectangle 失去向它相交的 Rectangle 移动的能力,而不会妨碍它在任何其他方向上的移动?