二维边界框碰撞,墙壁

时间:2011-12-21 02:35:59

标签: c# xna collision-detection

我目前无法使用边界框使精灵显得稳固。碰撞与下面的代码完全一致。

位置是地图上的主要角色位置。 character2是主角将与之碰撞的18 x 28精灵的名称。

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

我觉得这很简单,但对于我的生活,我无法弄明白。

总结我的问题:如何让character2精灵在碰撞时显得坚固?

此外,即使我的主精灵在碰撞时停止(通过将速度降低到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))
        {
            // ????
        }

2 个答案:

答案 0 :(得分:1)

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

  if (HorizontalCollision(b1, b2))
  {
    xv = -xv;
  }
  else if (VerticalCollision(b1, b2))
  {
    yv = -yv;
  }

  Position2.X += xv;
  Position2.Y += yv;
在这种情况下,

xvyv将是速度变量,并且当分别存在水平或垂直碰撞时,您只是简单地反转它们的方向。这将导致对象或角色逐字地反弹。

然后,您可以添加xv *= .99yv *= .99,以便在每个渲染循环后减慢速度,模拟动量和摩擦力。当您使用这样的速度变量时,会打开很多不同的可能性。顺便说一句,这被称为Euler integration,并且对于动画来说非常有效。

答案 1 :(得分:0)

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

这就是你想要的吗? :P