奇怪的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
游戏中allocation
和init
UIDynamicAnimator
将导致physicsWorld
和它的gravity
属性采取不同的行为。
在UIDynamicAnimator
初始化期间,似乎physicsWorld
被移除了很短的时间(切换引擎?)。
结论:
-
Alloc和init
UIDynamicAnimator
asap并以不同的方式处理您的物理世界,例如呼叫[UIDynamicAnimator new];
在委托的didFinishLaunchingWithOptions
要么
- 不要混用UIKit Dynamics和SpriteKit