【发布时间】:2013-10-28 13:35:34
【问题描述】:
背景
- 我正在为孩子们制作一个 iOS 应用程序,您可以在其中使用手指在屏幕上拖动球。
- 我正在使用 Chipmunk 7.0.0 进行物理模拟。
- 我已经调整了Chipmunk demo code 来实现拖动功能。
- 我使用 2 毫秒的固定时间步长。 (这不像我的应用有更好的事情可做......)
问题
我最近添加了代码,以便在球相互碰撞或与墙壁碰撞时播放声音,我在 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回调:球确实多次从墙上反弹。 - 减小步长:物理引擎实际上需要更长的时间才能收敛。
- 声音效果的速率限制:更好,但即使球看起来静止了,它仍然会发出噪音。
问题
有没有办法过滤被困物体的碰撞?
【问题讨论】:
-
花栗鼠不为两个接触体的第一次接触事件提供回调吗?
-
@LearnCocos2D 是的,有
begin回调,但它与separate回调有同样的问题。顺序如下: 1) 球与墙壁碰撞。 2) 碰撞给球施加了一个推动力,导致球弹开。 3) 球和墙分开。 4) 约束求解器提供一个力将球推回墙壁,引起另一次碰撞并返回步骤 1。
标签: ios objective-c cocos2d-iphone chipmunk simpleaudioengine