【发布时间】:2010-03-27 15:24:21
【问题描述】:
所以我的问题很简单,我想这可以归结为您对碰撞检测的期望。为简单起见,假设我们正在讨论由边界框定义的 2D 精灵。另外,假设我的精灵对象有一个检测碰撞的功能,如下所示:S.collidesWith(other);最终场景在移动,场景中的“墙”可以移动,对象可能不会碰到墙。
所以一个简单的实现可能看起来像这样(伪代码):
moveWalls();
moveSprite();
foreach(wall as w) {
if(s.collidesWith(w)) {
gameover();
}
}
这样做的问题是,如果精灵和墙相互移动,取决于情况(例如对角力矩)。它们可能会相互穿过(不太可能但可能发生)。
所以我可以这样做。
moveWalls();
foreach(wall as w) {
if(s.collidesWith(w)) {
gameover();
}
}
moveSprite();
foreach(wall as w) {
if(s.collidesWith(w)) {
gameover();
}
}
这解决了互相传递的问题,但出现了另一个罕见的问题。如果它们彼此相邻(字面意思是下一个像素)并且墙壁和精灵都向左移动,那么我将得到一个无效的碰撞,因为墙壁移动,检查碰撞(命中)然后精灵被移动。这似乎不公平。此外,冗余碰撞检测感觉非常低效。我可以给予玩家移动优先权来缓解第一个问题,但它仍在检查两次。
moveSprite();
foreach(wall as w) {
if(s.collidesWith(w)) {
gameover();
}
}
moveWalls();
foreach(wall as w) {
if(s.collidesWith(w)) {
gameover();
}
}
我是否只是在思考这个问题,是否应该将其归结为“它会发生得非常罕见,以至于没人会关心”?当然,在查看基于精灵的旧游戏时,我经常会发现碰撞检测存在细微缺陷的情况,但我认为现在我们可以做得更好:-P。人们的想法是什么?
【问题讨论】:
标签: language-agnostic collision-detection