3

我有一个移动的火星着陆器,我想在我正在制作的游戏中检测到它何时撞到加油站的顶部。我想知道确切知道他们何时击中的最佳方法。

我现在正在做的是我有 3 个计时器来控制水平、垂直和重力运动。每个计时器都会使火星着陆器移动一点,所以我将碰撞检测代码放在每个计时器的顶部和底部,但由于每个计时器每 50 毫秒触发一次 a) 它不会准确检测到碰撞的时间 b) 它会调用崩溃检测代码很多次。

这是其中一个计时器的样子,并且对于所有 3 个计时器来说几乎相同(我在 vb 2008 中制作游戏,这只是一些伪代码):

gravity timer:
    detectCrash()
    Move ship 
    detectCrash()
End timer
  1. 什么是更准确的方法来查看它们是否在从碰撞到调用的代码的响应时间方面发生碰撞。

  2. 我如何将检测称为较低的次数?

我可能会制作另一个每 10 毫秒左右触发一次的计时器并检查碰撞,但这会运行代码很多次(每秒 100 次),不是吗?

我也很好奇大型游戏如何处理这样的事情,这种事情很可能每秒发生很多次。

谢谢。

4

2 回答 2

2

您可以做的一件事就是使用一个计时器将所有运动控制在 16 或 17 毫秒(大约 60 fps),但即使这可能太快,您应该可以在 40 毫秒(25 fps)内完成。在这个计时器事件中,在移动之前计算对象的新位置,看看新位置是否会发生碰撞,如果不移动对象。

至少我会在 vb.net 中这样做。不过,我可能会选择 XNA。

于 2012-07-27T13:01:48.460 回答
1

您不希望有单独的计时器来移动对象和检测碰撞。这种方法有几个明显的问题:

  • 它根本无法扩展。想象添加更多对象。你会为每个计时器设置两个计时器(X 和 Y 平面各一个)吗?您会添加另一个计时器来检测每个对象的碰撞吗?
  • 计时器可能不同步 - 想象一下,在 X 平面上移动飞船的代码比 Y 平面的代码运行时间要长得多。突然间,你的船垂直移动的频率超过了水平移动的频率。

“真实”游戏只有一个循环,可以消除大部分问题。在伪代码中:

  1. 检查用户输入
  2. 计算船的新 X 和 Y 位置
  3. 检查碰撞
  4. 在屏幕上绘制结果
  5. 转到 1

显然,除了简单的游戏之外,还有更多的东西!但这是您想要的方法,而不是尝试为您正在进行的所有事情设置单独的循环。

于 2012-07-27T12:55:57.700 回答