奇怪的SpriteKit + UIDynamics Bug

所以我正在使用SpriteKit开发游戏。 为了让游戏更有趣,我决定使用UIDynamicAnimator为我游戏中的UIKit元素添加一些物理效果。 除了有一个主要问题外,一切都很好。 我分配/初始化UIDynamicAnimator的那一刻如下:

animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; 

我游戏中的物理机构完全抵消了。 即使我没有指定参考视图,物理仍然会得到偏移。

奇怪的是,我在一个完全独立的ViewController中创建了UIDynamicAnimator,所以它不像它共享相同的参考视图或类似的东西。

更新 :即使是简单地创建UIDynamicItemBehavior的行为,如下所示:

 UIDynamicBehavior* a = [[UIDynamicBehavior alloc] init]; 

弄乱了我的场景物理。

我假设这是SpriteKit和UIDynamics共享的物理引擎的内部错误。

有人有什么建议吗?

好的,我发现了一个非常糟糕的解决方案。 您需要做的就是在展示SKScene之前以某种方式使用UIDynamics框架。 例如,在呈现场景之前简单地运行这一行代码将消除同时使用SpriteKit和UIDynamics引起的奇怪的物理错误:

 UIDynamicBehavior* a = [[UIDynamicBehavior alloc] init]; 

我在内部假设这个物理引擎是以sprite kit物理正常运行的方式准备的。 不幸的是,我不相信这个解决方案,因为有一天它可能无法工作,因此我的整个游戏都会受到影响。

因此,作为UIDynamics框架的替代方案,我决定使用UIView Animation来复制我在UIDynamics框架中获得的一些有趣的物理效果。

编辑IOS 8根据doctordoder,这个bug仍然存在于iOS 8中,这种解决方法仍然有效。

请注意,在iOS 9中:@Epic Byte的解决方案仍然可以解决半个问题。

它更早地启动了物理引擎(在我们initialize SpriteKit游戏之前等)但不幸的是它混合了它

SpriteKit游戏中allocationinit UIDynamicAnimator将导致physicsWorld和它的gravity属性采取不同的行为。

UIDynamicAnimator初始化期间,似乎physicsWorld被移除了很短的时间(切换引擎?)。

结论:

  • Alloc和init UIDynamicAnimator asap并以不同的方式处理您的物理世界,例如呼叫

    [UIDynamicAnimator new]; 在委托的didFinishLaunchingWithOptions

要么

  • 不要混用UIKit Dynamics和SpriteKit