0

我正在 Arduino 上编写射击游戏,并且正在使用 AABB 碰撞检测 -

参考:边界框碰撞检测

我的问题是对象相互碰撞的时间,我目前正在使用一个基本触发器,这在两个对象相交的持续时间内是正确的。我认为我需要的最好用脉冲计数问题来描述,无论“脉冲长度”(或交叉持续时间)如何,都只检测到 1 个计数: 在此处输入图像描述

我如何在 C++ 中实现它?我目前正在使用的功能:

bool CollisionTest( xPlayer, yPlayer, xAlien, yAlien, width, height)
{
  if( ((xPlayer+width) >= xAlien)  && (xPlayer <= (xAlien+width))  &&
      ((yPlayer+height) >= yAlien) && (yPlayer <= (yAlien+height)) )
    return true;
  else
    return false;
}
4

2 回答 2

1

你需要一个边缘检测器!

bool collision = false;
int pulses = 0;

//For each frame..
if(!collision && CollisionTest(....)) {
    pulses++;
}
collision = CollisionTest(....);

不知道为什么需要计算它们,但这应该可以。

于 2013-12-31T00:34:03.723 回答
0

所以你只想抓住领先优势?除了您应该将当前值与先前值进行比较之外,没有什么特别聪明的说法。

您应该如何最好地做到这一点可能取决于您更广泛的数据格式。

如果您将对象存储为位置和速度,并且只是在每帧添加速度(本质上是欧拉积分),那么只要每个位置没有重叠但每个位置+速度存在,您就可以触发碰撞。即使您没有明确存储速度但可以通过其他方式提供它,这也是一个潜在的答案。

同样,如果您要存储当前位置和最后位置(例如,用于 Verlet 集成),那么您可以像这样进行两个测试。

如果有一个方便的结构可以只存储前一帧的结果并与当前帧进行比较,那么这也是一个选择——如果你的内存或缓存预算紧张,但如果有任何特殊的游戏std::map,由 a 索引可能会过大——std::pair您可以利用的特定知识,那么您可能不需要注销该选项。

于 2013-12-31T00:31:37.800 回答