2014-02-08 64 views
3

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

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

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

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

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

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

打乱了我的场景的物理。

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

任何人有任何建议吗?

+0

在WWDC 2013的视频[入门UIKit Dynamics](https: //developer.apple.com/wwdc/videos/?include=206#206)Apple讨论了何时可以使用一个,何时可以使用另一个。很明显,苹果公司将它们视为替代品(在幕后使用相同的物理引擎,请参阅[模拟物理](https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Physics/Physics.html )),而不是你同时使用的两种技术。 – Rob

+0

DUDE我有同样的问题 – michaelsnowden

回答

2

好吧,我发现了一个漂亮的hacky解决方案。所有你需要做的就是在呈现你的SKScene之前以某种方式使用UIDynamics框架。例如,简单地运行这一行代码展示您的场景将消除因同时使用SpriteKit和UIDynamics同时怪异的物理错误之前:

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

我这个内部假设准备在物理引擎这样一个方式,精灵套件物理将正常行为。不幸的是,我不相信这个解决方案,因为它可能无法工作,我的整个游戏都会因此而受到影响。

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

编辑IOS 8 根据doctordoder,这个错误在iOS 8中仍然存在,并且此解决方法仍然有效。

+2

HAHAHAH WTF为什么要这样做?它也完全修复了我的错误! – michaelsnowden

+0

@doctordoder是的这是一个非常奇怪的解决方法。我想在iOS 8上测试一下,看看bug是否已经修复。当我有机会的时候,我会编辑我的答案。 –

+0

这个错误实际上是在iOS 8中发生的,并且您的修复仍然有效。 – michaelsnowden

0

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

它开始的物理引擎早期(前我们initializeSpriteKit游戏等),但遗憾的是它混合起来

而且allocationinitSpriteKit游戏过程中UIDynamicAnimator将导致physicsWorld,它就像gravity行为方式的属性。

另外它似乎在UIDynamicAnimator初始化过程中短时间(交换引擎?)被删除physicsWorld

结论:

  • 的Alloc和init UIDynamicAnimator尽快与处理您的物理世界例如不同调用

    [UIDynamicAnimator new];在委托的didFinishLaunchingWithOptions

  • 不要混用UIKit的动力和SpriteKit