如何让 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 版本来解决问题。
我一直在研究 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 版本来解决问题。