如何检测与Chipmunk Physics引擎的永久性碰撞
-
05-07-2019 - |
题
我正试图播放“boing”当球形击中任何其他形状时发出声音。哪个有效。但是工作得太好了......
当球停下来或开始滚动时,它会与任何接触的球发生永久性碰撞,因此“挥杆”声音不断响起。
我在chipmunk文档中找不到任何东西告诉我两件事何时发生永久性碰撞。所以我想我必须以某种方式弄清楚自己,可能是某种计时器,将最后一次碰撞与当前碰撞进行比较。但这对我来说听起来很糟糕。
有没有人解决过这个问题?你是怎么解决的?
解决方案
你不能只是玩你的“boing”吗?联系人破产时发出声音吗?
在chipmunk中有一个回调函数, typedef void(* cpCollisionSeparateFunc)(cpArbiter * arb,struct cpSpace * space,void * data)
这样,无论什么时候弹跳,你都可以获得,但是当它刚刚开始时就不会。 “当然,当你的形状滚动时你也会得到一个,但这可能是一个特征,取决于你如何看待它。
其他提示
我不认为我要说的是一个好习惯,但我相信它会解决你的问题:
-
对于每个对象,保留两个状态变量:(1)最后一个对象与之碰撞,(2)最后一次碰撞时间。
-
碰撞时,如果碰撞的物体不同(和球)或某个“增量时间”,则仅播放声音。自上次碰撞以来已经过去了。然后记录最后的碰撞统计数据。
醇>
这非常简单且非常有效:
// In your ball interface
id lastCollisionObject;
double lastCollisionTime;
// When a collision occurs...
double now = GetTime();
id other = GetCollisionObject();
if ((now - lastCollisionTime) > 0.3 || other != lastCollisionObject) {
PlaySound(kBoingSound);
}
lastCollisionObject = other;
lastCollisionTime = now;
形状在花栗鼠中没有速度。他们所附着的身体有它。你可以像这样访问速度:“myShape.body-> v”。我同意您应该能够检查速度是否超过某个阈值,以了解何时发生“影响”。您还可以检查旋转速度,看球是否在滚动。
不隶属于 StackOverflow