【问题标题】:2D Bounding Box Collisions, Walls2D 边界框碰撞,墙壁
【发布时间】:2011-12-21 02:35:59
【问题描述】:

我目前无法使用边界框使精灵看起来是实心的。使用下面的代码,碰撞工作得很好。

位置是地图上主要角色的位置。 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))
        {
            // ????
        }

【问题讨论】:

    标签: c# xna collision-detection


    【解决方案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,对于动画来说非常高效。

    【讨论】:

      【解决方案2】:
      While(Collision(b1, b2))
      {
          Position.X -=1;
      }
      

      这就是你想要的吗? :P

      【讨论】:

      • 那只是冻结屏幕=X
      猜你喜欢
      • 2011-04-21
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 2015-08-03
      • 1970-01-01
      • 2012-12-06
      • 2013-02-18
      相关资源
      最近更新 更多