两个2D游戏对象之间不会发生碰撞,如果其中一个被移动,它们会相互通过

时间:2016-06-19 09:36:33

标签: c# xna monogame

My Problem can be seen through this video..

你可以在上面的链接中看到,直到我向下移动杆,每个东西都运行良好但是一旦我向下移动,汉堡就会卡在杆上。帮助我,我希望它只是偏离表面。乒乓球比赛......

对于偏转,我使用了以下代码片段。

let fr:NSFetchRequest<TestEntity>=TestEntity.fetchRequest()

do {
   let searchResults=try context.fetch(fr)
   if let results=searchResults {
      for result in results {
         print("testAtt = \(result.testAtt)")
      }
   }
} catch {

}

这里的游戏球是指汉堡,而杆是指顶部和底部的图像。

3 个答案:

答案 0 :(得分:1)

似乎正在发生的事情是杆球比球在一帧中移动更重要更多。换句话说,如果球每帧移动3个像素但是物体重叠5个像素,则它们将不能通过简单地改变方向而脱离碰撞。你需要首先将球移出碰撞。

也就是说,碰撞检测和响应始终是难以编写的代码。关键是将检测代码与响应代码分开。

换句话说。对于每一帧:

  1. 检测所有碰撞
  2. 移动所有对象
  3. 你现在正在做的是在检测阶段搬家。当两个物体相互移动时,这会导致麻烦。

    关于这个主题的方式比我能回答的更多。我建议四处寻找有关AABB碰撞检测的教程。

答案 1 :(得分:0)

你的CollisionRectangle是MonoGame / XNA中内置的Rectangle类吗?

假设它是并且循环在更新中,也许您可​​以尝试插入一个中断,以便它在第一次更改后立即停止更新游戏球速度。这是因为游戏每秒更新60次,当游戏更新时,情况可能会持续几毫秒左右。

foreach (Bar rod in bar)
{
    if(rod.CollisionRectangle.Intersects(GameBall.CollisionRectangle))
    {
        GameBall.speed *= -1;
        Console.WriteLine("game" + GameBall.speed);
        break;
    }
}

如果它不起作用,请告诉我,如果我有空,我可以在新项目中尝试。

答案 2 :(得分:0)

当球与杆相交时,你改变了方向,但碰撞仍在这里,所以你可以试试这个:

foreach (Bar rod in bar)
{               
        if(rod.CollisionRectangle.Intersects(GameBall.CollisionRectangle))
        {
            GameBall.speed *= -1;

            // Reset position of the ball
            // Something like :
            // For the top bar
            Gameball.y = rod.y + rod.height;

            // For the bottom bar
            // Gameball.y = rod.y - Gameball.height

            Console.WriteLine("game" + GameBall.speed);                  

        }
    }