当球形击中任何其他形状时,我正试图发出“boing”声。哪个有效。但是工作得太好了......
当球停下来或开始滚动时,它会与触碰的任何东西发生永久性碰撞,因此“boing”声会不断发出。
我在chipmunk文档中找不到任何东西告诉我两件事何时发生永久性碰撞。所以我想我必须以某种方式弄清楚自己,可能是某种计时器,将最后一次碰撞与当前碰撞进行比较。但这对我来说听起来很糟糕。
有没有人解决过这个问题?你是怎么解决的?
答案 0 :(得分:2)
我不认为我要说的是一个好习惯,但我相信它会解决你的问题:
对于每个对象,保留两个状态变量:(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;
答案 1 :(得分:2)
当联系人被破坏时,你不能只播放“boing”声音吗?
在花栗鼠中有一个回调,typedef void (*cpCollisionSeparateFunc)(cpArbiter *arb, struct cpSpace *space, void *data)
这样,无论什么时候弹跳都可以获得,但是当它刚刚滚动的时候就没有。 “当然,当你的形状滚动时你也会得到一个,但这可能是一个特征,取决于你如何看待它。
答案 2 :(得分:1)
形状在花栗鼠中没有速度。他们所附着的身体有它。您可以像这样访问速度:“myShape.body-> v”。我同意您应该能够检查速度是否超过某个阈值,以了解何时发生“影响”。您还可以检查旋转速度,看球是否在滚动。