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

时间:2015-08-27 00:37:54

标签: ios xcode sprite-kit ios9 skaction

我一直在研究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类似。

您传递了所需操作的名称。我们将自动查看所有序列化操作文件中的应用包内部,找到具有相应名称的文件,然后将其显示给应用程序。

这看起来不错,但我找不到任何文档,或者在出错时弄清楚如何调试它。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

使用另一台机器(我的家用笔记本电脑)全新安装Xcode,问题就消失了。我还注意到,我第一次尝试时,我必须做一些小的编译修复,例如将CGPoint.zero重命名为CGPoint.zeroPoint,我想应该发出警告,警告存在某种版本冲突。这一次是新编译,它编译并开箱即用。

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