奇怪的SpriteKit + UIDynamics Bug

时间:2014-02-08 21:04:14

标签: ios ios7 sprite-kit uikit-dynamics uidynamicbehavior

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

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

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

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

更新:即使是这样简单地创建UIDynamicItemBehavior的行为:

UIDynamicBehavior* a = [[UIDynamicBehavior alloc] init];
弄乱了我的场景物理。

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

有人有任何建议吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:0)

请注意,在iOS 9中:@Epic Byte的解决方案仍然采用半解决方法。

它提前启动了物理引擎(在initialize SpriteKit游戏等之前)但不幸的是将它混合

allocation游戏中,initUIDynamicAnimator SpriteKit会导致physicsWorld及其gravity等属性的行为不同。< / p>

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

结论:

  • Alloc和init UIDynamicAnimator尽快处理您的物理世界,例如:致电

    代理人[UIDynamicAnimator new];

  • 中的

    didFinishLaunchingWithOptions

  • 不要混合使用UIKit Dynamics和SpriteKit