【问题标题】:C# XNA Precise Collisions?C# XNA 精确碰撞?
【发布时间】:2011-10-17 00:26:37
【问题描述】:

嘿,伙计,我正在制作一个桨/乒乓球游戏,现在我正在尝试找出如何在我的桨和我的球之间进行精确碰撞。目前如果球击中左侧设置 x 速度,这是基本碰撞和 y 速度.. 等等,但我想弄清楚如何让它在一个方向上反弹,可以这么说,如下图所示:

有没有办法做到这一点?任何帮助将不胜感激。

【问题讨论】:

    标签: c# xna collision-detection


    【解决方案1】:

    可以通过否定y 速度并保持x 速度来处理您的示例。

    球和桨角之间的碰撞更加困难。您需要找到确切的碰撞点,然后计算从球中心到碰撞点的向量。最后取反沿该轴的速度,同时保持组件在正交轴的方向上。

    【讨论】:

      【解决方案2】:

      也要小心重影。我的意思是球的速度可以足够大,以至于没有任何帧(或更新例程调用)在其中球与球棒实际相交,因此您不会检测到碰撞。看我的插图。在其中,两个不同框架中的球确实与球棒相交,即使没有直接相交。这样做的结果将是球“穿过”球棒并神奇地出现在另一侧。

      要解决这个问题,不能用球的位置来计算是否有交叉点,需要计算每一帧球的新旧位置的差值,看看那条线是否(差异)在任何点与球棒相交。

      解决这个问题的简单方法是将蝙蝠视为一条水平线,然后您可以进行简单的线-线交叉检查。如果它们相交,就会发生碰撞。更复杂的方法是进行线/矢量矩形相交。这样做的好处是您还可以检测与角落的碰撞,这是乒乓球/突围比赛的重要组成部分。

      【讨论】:

        【解决方案3】:

        我知道这对你目前的情况没有帮助,但你可以尝试使用像 Farseer 这样已经制作好的物理引擎来非常轻松地为你处理这些碰撞。

        【讨论】:

          【解决方案4】:
          protected override void Update(GameTime gameTime)
          {
              ballrect = new Rectangle((int)ballpos.X, (int)ballpos.Y,
                                       ball.Width, ball.Height);
          
              paddlerect = new Rectangle((int)paddlepos.X, (int)paddlepos.Y,
                                         paddle.Width, paddle.Height);
          
              ms = Mouse.GetState();
              paddlepos.X = ms.X;
          
              if (ballrect.Intersects(paddlerect))
              {
                  bhpaddle();
              }
          
              ballpos += ballvel;
          
              if (ballrect.Y>= paddlerect.Y)
              {
                  ballpos = new Vector2(400, 480);
                  bhpaddle();
                  ballpos += ballvel;
                  l--;
              }
          
              base.Update(gameTime);
          }
          
          
          
          public void bhpaddle()
          {
              ballvel.Y *= -1;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-18
            • 1970-01-01
            • 1970-01-01
            • 2016-07-20
            相关资源
            最近更新 更多