如何可靠地使用SKAction(name:)?

5
我一直在研究DemoBots示例,但在各种设备上运行时遇到了很多问题。
目前我遇到的问题是,在iPad Mini上启动应用程序后,加载动画时会崩溃。它会在AnimationComponent.swift文件中的从文件加载操作那一行崩溃:

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

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个回答

1

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

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

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


0

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

在另一台机器上(我的家用笔记本电脑)使用全新安装的 Xcode,问题消失了。我还注意到第一次尝试时,我必须进行一些较小的编译修复,如将 CGPoint.zero 重命名为 CGPoint.zeroPoint,这应该引起警示,表明存在某种版本冲突。这次使用全新安装后,它可以直接编译和运行。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接