如何让 SKAction(name:) 可靠地工作?

How to get SKAction(name:) to work reliably?

我一直在研究 DemoBots 示例,但在让它在所有设备上运行时遇到了很多麻烦。

https://developer.apple.com/library/prerelease/ios/samplecode/DemoBots/Introduction/Intro.html

我目前遇到的问题是,在 iPad Mini 上,应用程序启动但在加载动画时崩溃。它在 AnimationComponent.swift 从文件加载操作的行崩溃:

let bodyAction: SKAction?  
if let name = bodyActionName {
    // crash here  
    bodyAction = SKAction(named: name)  
}  
else {  
    bodyAction = nil  
}  

调试应用程序显示它试图加载一个名为 "ZappedShake" 的 SKAction,但因数组越界异常而崩溃。

在 iPhone 5S 上运行良好。我最好的猜测是它与更快的 iPhone 5S 的竞争条件正在加载其中包含序列化操作的文件,并且在执行到这一点时操作可用。但是在较旧的单核iPad上,文件尚未加载,调用失败。

两者都是真正的硬件 运行 iOS9 13A4325c,编译于 XCode Version 7.0 beta 4 (7A165t)。

使问题更加困难的是我看不到明显创建 "ZappedShake" - ReferenceActions.sks - 的文件实际加载的位置。它由 ReferenceScene.sks 引用,但在任何代码或项目中的任何其他地方我都看不到该文件被引用。

SKActions 是否有某种名称约定神奇的文件加载机制?为什么它适用于 iPhone 5S 而不是 iPad?

更新:在此处找到更多相关信息:http://asciiwwdc.com/2015/sessions/604

今年我们还专注于引用和实例化。 我们知道您花了很多时间为您的游戏设计高质量的内容和动画,我们希望您可以在任何您喜欢的地方重复使用这些内容。

我们允许您为节点和动作创建序列化数据文件,然后将它们添加为参考,而不是仅仅将它们加载到场景中。

这样,每次您对源资产进行更改时,都会自动反映在您的游戏内容中。

如何为节点执行此操作?对于节点,我设计了场景的一部分,可能是背景元素,或者是编辑器中带有 Xcode 的一些风景,然后我可以将这些文件拖放到 Xcode 中的主场景中,然后它会自动创建一个参考,并为您设置好。

如果你想在代码中这样做你也可以,你可以手动构造一个 SKReferenceNode,为它分配一个文件名甚至 URL 并且当该内容首次出现时在您的游戏中,我们将根据您捆绑包中文件的最新版本加载该内容。 我们也可以对动作做同样的事情。使用动作请查看我们出色的新动作编辑器,除了在 Xcode 中创建和组合动作之外,您还可以为它们命名。

这些名称是在您的游戏中使用它们的关键。我们在 SKAction 中添加了一个名为 actionNamed 的选择器。这就像它对 SKTexture 和 textureNamed 一样工作。

你传入你想要的动作名称。我们将在所有序列化操作文件中自动查看您的应用程序包的内部,找到具有适当名称的文件,然后将其显示给应用程序。

这看起来不错,但我找不到任何关于它的文档,也找不到出错时如何调试它。

DemoBots 游戏在使用 Xcode 版本 7.0 beta 6 (7A192o) 编译时似乎 运行 可靠。

使用另一台机器(我的家用笔记本电脑)全新安装 Xcode 问题消失了。我还注意到,在我第一次尝试时,我不得不做一些小的编译修复,例如将 CGPoint.zero 重命名为 CGPoint.zeroPoint,我想这应该已经敲响了警钟,表明存在某种版本冲突.这次是全新安装,编译后 运行 开箱即用。

我仍然不完全理解如何获取参考操作,但至少我现在有多个工作版本的 Demobots,所以我可以在那里复制工作代码。

不是你,是iOS。影响 32 位设备(如 iPad Mini。)的操作引用存在错误。

此问题已在 iOS 9.2 Beta 1 中得到修复,根据 Apple 开发者论坛上的此主题: https://forums.developer.apple.com/thread/17267

在较新的 64 位设备(如 iPhone 6)上的模拟器中尝试 运行。或者尝试将您的 iPad Mini 升级到 iOS 9.2 Beta 1。或者等待下一个 iOS 版本来解决问题。