3

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

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

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

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

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

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

弄乱了我场景的物理特性。

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

有人有什么建议吗?

4

2 回答 2

2

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

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

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

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

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

于 2014-02-08T21:27:34.437 回答
0

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

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

并且在游戏过程中会导致allocation和它的属性一样的行为不同。initUIDynamicAnimatorSpriteKitphysicsWorldgravity

此外,在初始化期间,它似乎physicsWorld被删除了一小段时间(切换引擎?) 。UIDynamicAnimator

结论:

  • 尽快分配和初始化UIDynamicAnimator并以不同的方式处理您的物理世界,例如调用

    [UIDynamicAnimator new];在代表的didFinishLaunchingWithOptions

或者

  • 不要混用 UIKit Dynamics 和 SpriteKit
于 2016-01-12T11:33:59.623 回答