我正在Arduino上写一个射击游戏,我正在使用AABB碰撞检测 -
参考:Bounding Box Collision Detection
我的问题是时间物体相互碰撞,我目前正在使用一个基本触发器,在两个物体相交的时间内是真的。我认为最需要的是脉冲计数问题,无论“脉冲长度”(或交叉持续时间)如何,只检测到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;
}
答案 0 :(得分:1)
你需要一个边缘探测器!
bool collision = false;
int pulses = 0;
//For each frame..
if(!collision && CollisionTest(....)) {
pulses++;
}
collision = CollisionTest(....);
不确定为什么需要计算它们,但是应该这样做。
答案 1 :(得分:0)
所以你只想抓住前沿?除了你应该将当前值与之前的值进行比较之外,没有什么特别聪明的了。
如何做到这一点可能取决于您更广泛的数据格式。
如果您将对象存储为位置和速度,并且每帧只添加速度(因此,基本上是欧拉积分),那么只要每个位置没有重叠但每个位置+速度都可以触发碰撞。即使您没有明确地存储速度,也可以通过其他方式提供速度,这是一个潜在的答案。
同样,如果您要存储当前位置和最后位置(例如,对于Verlet集成),那么您可以执行这样的两个测试。
如果有一个方便的结构来存储前一帧的结果并与当前帧进行比较那么这也是一个选项 - std::map
索引的std::pair
如果你打开则可能有点过分紧张的内存或缓存预算,但如果有任何特殊的游戏特定知识,你可以利用,那么你可能不需要关闭该选项。