背景
- 我正在为孩子们制作一个 iOS 应用程序,您可以在其中用手指在屏幕上拖动球。
- 我正在使用 Chipmunk 7.0.0 进行物理模拟。
- 我已经修改了Chipmunk 演示代码来实现拖动功能。
- 我正在使用 2 ms 固定时间步长。(这不像我的应用程序有更好的事情要做......)
问题
我最近添加了代码以在球相互碰撞或与墙壁碰撞时播放声音,我正在postSolve
回调中执行此操作:
static void postSolve(cpArbiter *arb, cpSpace *space, cpDataPointer userData)
{
GameLayer *layer = (__bridge GameLayer *)userData;
[layer collisionHandler:arb];
}
-(void) collisionHandler:(cpArbiter*)arb
{
if(cpArbiterIsFirstContact(arb)) {
[[SimpleAudioEngine sharedEngine] playEffect:kCollisionEffectFilename];
}
}
这就是问题所在......当我将一个球拖到墙上时,它会产生非常大量的碰撞,即使在过滤时cpArbiterIsFirstContact
也是如此,这听起来很糟糕。看起来球正在从墙上弹起,被约束推回墙上,冲洗并重复。在这种情况下,我只想播放一次或两次碰撞声音。
我尝试过的东西似乎不起作用...
cpArbiterTotalKE
使用、或相对速度进行过滤cpArbiterTotalImpulse
:冲量、动能和相对速度都在典型碰撞的范围内。- 使用
separate
回调:球确实多次从墙上反弹。 - 减小步长:物理引擎实际上需要更长的时间来收敛。
- 限制声音效果的速率:更好,但即使在看起来静止后,球仍然会发出噪音。
问题
有没有办法过滤被困物体的碰撞?