今天使用 SpriteKit 的扩展

Today’s Extension Using SpriteKit

我正在尝试制作一个小部件游戏,是否可以在 Today Extension 中使用 SpriteKit?。我一直在搜索类似的帖子,但我只发现了一个与在 AppleWatch 扩展中使用 SpriteKit 相关的问题。

绝对有可能。我认为您的目标是构建类似于流行的 "Steve" Widget Game 的东西,并且我相信这是内置在 Today Extension 中的 SpriteKit 游戏。

首先,我建议全面了解 Today Extensions 及其限制,然后全面了解 SpriteKit 及其限制。

您真正想要专注的事情是制作一款极其高效的应用程序。全方位,从实际代码和代码的运行方式。这是因为 Today Extensions 并不是真正的应用程序,而是 "extensions" 到您的设备,因此如果您的游戏是图形密集型或内存密集型游戏,您的应用程序将会崩溃。

我尝试在 spriteKit 中为 ios 今天的扩展开发游戏,将 SKViews 添加到 UIView,但没有成功。今天的扩展似乎没有加载场景。我认为这是不可能的——在今天的扩展中使用 spriteKit。但我找到了很好的解决方案——使用 UIKit 而不是 spriteKit。它是非常强大的游戏开发框架,我认为 Steve 游戏是通过 UIKit 开发的。您可以在此示例中检查通过 UIKit 添加动态:https://www.raywenderlich.com/50197/uikit-dynamics-tutorial

如果需要,我也可以上传在 github 上开发的今天扩展游戏中使用 UIKit 的示例。

我也在今天屏幕上制作一些游戏。到目前为止,我已经找到了 3 个有效的解决方案:

  1. 就像提到的使用 UIKIT
  2. 最小方式使用SpriteKit
  3. 使用屏幕外图像进行渲染

解决方案 2 的问题是,它非常不可靠。即使定期调用 completionHandler!(NCUpdateResult.newData) 也没有用。 所以只是最后SKAction的有限使用带来了很多。

解决方案 3 也不错,而且效果很好。当然你必须重新发明轮子,不能使用 SpriteKit 的好功能。但是因为我已经在 watchOS 游戏中使用了这种方法,所以在 Extensions 中使用起来并不费力。

我推荐解决方案 3,因为您可以完全控制它,而且效果很好。

几个月前我做了一个框架来解决这个问题,link here。我在 iOS 11 中没有时间正确测试它,所以可能会有一些新错误。

我发现将 SpriteKit 与 Today Extensions 一起使用的唯一可行解决方案是创建 SKView 并在 viewWillTransition(to size:with coordinator:) 中呈现场景。这是必要的,因为 Today Extensions 的生命周期与普通应用程序不同,look at these iOS Widget Gotchas 以获得有关其工作原理的更多详细信息。 编辑:设置这些东西的正确方法现在可能是 iOS 11 中的 viewWillAppear,但可能需要进行一些测试。

创建小部件游戏时要考虑的另一个非常重要的事情是,您只有很少的内存(如果我没记错的话是 16mb)来构建您的游戏。您必须不惜一切代价减少内存使用量,否则小部件将崩溃并显示一条消息,告诉您它无法加载。