何时检查碰撞

3
我有一个漫游火星着陆器,我想在我制作的游戏中检测它何时撞到加油站的顶部。我想知道最好的方法来准确地判断何时发生碰撞。
目前我正在做的是使用三个定时器控制水平、垂直和重力运动。每个定时器使火星着陆器移动一点,所以我将碰撞检测代码放在每个定时器的顶部和底部,但由于每个定时器都会每50毫秒触发一次,a)它不会精确地检测到碰撞,b)它会多次调用碰撞检测代码。
以下是其中一个定时器的示例,所有三个定时器基本相同(我正在使用vb 2008制作游戏,这只是一些伪代码):
gravity timer:
    detectCrash()
    Move ship 
    detectCrash()
End timer
  1. 有没有更准确的方法来查看它们在碰撞时的响应时间,从碰撞到调用代码的时间?

  2. 如何使检测次数更少?

我可以可能创建另一个定时器,每隔大约10毫秒就会触发并检查碰撞,但这样会运行很多次代码(每秒100次),对吧?我也很好奇像这样的大型游戏如何处理类似的情况,因为这种情况很可能会在一秒钟内发生多次。

谢谢。


1
为什么在移动之前要检查崩溃?如果上一个迭代(定时器结束时的迭代)没有检测到崩溃,那么在定时器开始时也不会有崩溃,对吧?如果你去掉这个步骤,你就可以将处理碰撞的时间减少一半。 - APrough
哦,是这样的。因为有三个计时器,我以为其他计时器可能已经移动了飞船,如果在再次移动之前检查移动情况,那么需要的时间会更短。 - cohen
2个回答

2
你可以采用一个计时器来控制所有运动,以16或17毫秒(大约60帧)为最佳,但即使如此可能仍然过快,建议采用40毫秒(25帧)。在计时器事件中,在移动对象之前计算其新位置,查看新位置是否会发生碰撞,如果没有则移动对象。
至少在vb.net中我是这样做的。不过我可能会选择XNA。

1

您不想为移动对象和检测碰撞分别设置计时器。这种方法有一些明显的问题:

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

“真正的”游戏有一个单一的循环,这消除了大部分问题。伪代码如下:

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

显然,对于任何不止简单游戏的内容,还有更多要做!但是,这是您想要的方法,而不是尝试为所有正在进行的事情分别设置循环。


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