2D边界框碰撞,墙体

3

我目前遇到了一个问题,就是在使用边界框时无法让精灵呈现实心。下面的代码用于处理碰撞,可以正常工作。

“Position”是主角在地图上的位置,“character2”是一类18 x 28像素的精灵,主角会与它发生碰撞。

当主角与“character2”精灵碰撞时,我尝试调整位置(例如: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个回答

2

这要看你想要实现什么目标,但一个建议是这样的...

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

  Position2.X += xv;
  Position2.Y += yv;

在这种情况下,xvyv将是速度变量,当水平或垂直碰撞时,您只需反转它们的方向即可。这将导致对象或角色彼此弹开。
然后,您可以在每个渲染循环后添加xv *= .99yv *= .99来减慢速度,模拟动量和摩擦力。使用速度变量时,会有许多不同的可能性。顺便说一句,这被称为欧拉积分,对于动画来说非常有效。

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

这是你想要的吗?:P


那只是冻结了屏幕 =X - Mr Binx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接