2D边界框碰撞,墙壁

本文关键字:墙壁 碰撞 边界 2D | 更新日期: 2023-09-27 18:18:39

我目前在使用边界框使精灵看起来坚实时遇到了问题。下面的代码可以很好地处理碰撞。

位置是主要人物在地图上的位置。Character2是一个18 x 28的精灵的名字,主角将与之碰撞。

当主角与character2精灵碰撞时,我已经尝试相应地调整位置(例如:position)。X -=1;),但这只是滑动我的主要精灵,直到它不相交。

我有一种感觉,这是一件很简单的事情,但我就是想不出来。

总结一下我的问题:我如何让角色2的精灵在碰撞时显得坚实?

而且,即使我的主精灵在碰撞时停止(通过将速度降低到0),它也会被卡在那里,if语句进入无限循环。

        float x1 = Position.X;
        float y1 = Position.Y;
        float x2 = x1 + character2.Width;
        float y2 = y1 + character2.Height;
        BoundingBox b1 = new BoundingBox(new Vector3(x1, y1, 0), 
            new Vector3(x2, y2, 0));
        BoundingBox b2 = new BoundingBox(new Vector3(Position2.X, Position2.Y, 0),
            new Vector3(x2, y2, 0));

        if (Collision(b1, b2))
        {
            // ????
        }

2D边界框碰撞,墙壁

这取决于你想要发生什么,但一个建议是这样的…

  if (HorizontalCollision(b1, b2))
  {
    xv = -xv;
  }
  else if (VerticalCollision(b1, b2))
  {
    yv = -yv;
  }
  Position2.X += xv;
  Position2.Y += yv;
在这种情况下,

xvyv将是速度变量,当分别发生水平或垂直碰撞时,你只需改变它们的方向。这将导致物体或角色相互反弹。

你可以添加xv *= .99yv *= .99使速度在每个渲染循环后变慢,模拟动量和摩擦。当你使用像这样的速度变量时,会有很多不同的可能性。顺便说一下,这被称为欧拉积分,对于动画来说非常有效。

While(Collision(b1, b2))
{
    Position.X -=1;
}

这是你想要的吗?: P