gpt4 book ai didi

ios - 在 Chipmunk 中为被困物体过滤碰撞

转载 作者:行者123 更新时间:2023-11-28 22:23:33 26 4
gpt4 key购买 nike

背景

  • 我正在为 children 制作一个 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 上进行过滤时也是如此,这听起来很糟糕。看起来球从墙上弹回,被约束推回到墙上,冲洗,然后重复。在这种情况下,我只想播放一次或两次碰撞声音。

我尝试过的方法似乎不起作用...

  • 使用 cpArbiterTotalKEcpArbiterTotalImpulse 或相对速度进行过滤:冲量、动能和相对速度都在典型碰撞的范围内。
  • 使用单独的回调:球确实多次从墙上弹回。
  • 减小步长:物理引擎实际上需要更长的时间才能收敛。
  • 限速音效:更好,但即使球看起来静止不动,它仍然会发出噪音。

问题

有没有办法过滤被困物体的碰撞?

最佳答案

一个简单有效的解决方案是避免快速连续播放声音。

当球与墙壁接触时,检查球的“最后接触”计时器是否小于当前时间。如果是,播放声音并将球的“最后一次接触”时间设置为当前时间加上 x,其中 x 是声音不应再次播放的超时持续时间(即 0.5 秒)。

在cocos2d-iphone中你可以添加一个更新方法的deltaTime来记录时间。还有很多获取系统时间的方法,例如 [NSDate date].timeIntervalSince1970 提供了自 1970 年以来的当前秒数。我知道,这看起来很荒谬,但如果你再次获取该数字稍后,减去之前的秒数,得到秒数之差,这才是最重要的。

关于ios - 在 Chipmunk 中为被困物体过滤碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19636256/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com