【问题标题】:Using SpriteKit inside UIKit在 UIKit 中使用 SpriteKit
【发布时间】:2018-10-03 19:29:57
【问题描述】:

我正在考虑一个简单的应用程序,它有四个可以在屏幕上拖动的字符。在拖动它们时“摆动”——这就是动画。如果它们足够接近某个位置,它们就会捕捉到一个位置……就像在拼图中一样。没有动画,这一切在 UIKit 中都很简单。

我的第一个想法是在一个普通的旧UIView 中渲染每个字符在其自己的SKView 中。我可以将UIGestureRecognizers 附加到每个SKView 以跟踪点击和拖动。但我认为这意味着每个字符都有单独的GameScenes/SKView。这似乎违背了 SpriteKit 的原则。

另一种选择是带有四个精灵的单个GameScene。但我仍然需要跟踪和拖动它们,我不知道如何在全 SpriteKit 应用程序中做到这一点。

任何一种方法都比另一种方法更好吗?

【问题讨论】:

  • 对于性能问题,第二种方式是可行的。而且由于所有的 sknode 都来自 UIResponder,所以处理触摸事件并不难。
  • 我根本不会使用 SpriteKit。 UIKit 能够制作动画
  • 我有大约 200 种不同的动画,动画师将它们以 spritesheets 的形式发送给我。而且我认为 SpriteKit 比UIImageView.animationImages 更好地处理内存。而且我需要为每个精灵切换很多动画。
  • 如果您的动画师在精灵表中工作,那么技术就无关紧要了。您必须将精灵表分解为单独的图像/文件才能利用 SKTextureAtlas。如果您已经在 UIKit 中完成了所有工作,那么您只是在浪费时间和精力在 sprite kit 中从头开始重建它,全部用于动画。
  • 总共将有大约 50,000 张图像,即使使用严格的命名约定,也很难看出我将如何将工作表分解为单独的文件。但我的问题是:假设我这样做。那我怎么做动画呢?使用UIImageView's 动画方法?使用 Timers 或CADisplayLinks 或什么?似乎依靠 SpriteKit 来制作动画应该是最简单的。 FWIW,我在我的 OP 中第 2 段(“我的第一个想法”)的策略上取得了更大的成功。但这与可可颗粒背道而驰。你想把它离线吗?我仍然不知所措。

标签: ios sprite-kit uikit


【解决方案1】:

您应该实现一个具有单个场景和每个角色的单独精灵的场景。精灵将是 SKSpriteNode 实例,它们是 SKNode 实例,它们从 UIResponder 下降,因此可以响应触摸事件。

查看SKNode 的文档。这是适用于精灵以及任何其他类型节点的大量信息。特别是它说:

所有节点都是响应者对象,可以直接响应用户与屏幕上节点的交互……

然后有一节关于“Hit-Test Order is the reverse of Drawing Order”等。

【讨论】:

  • 是的,因为我发现我可以将UIGestureRecognizers 与精灵一起使用,我更倾向于第二个选项,正如你所建议的。简直太陌生了​​。为 Apple 设备编写代码 30 年,我仍然是一个 n00b!
  • 我在 1981 年左右开始使用 Apple ][+ :-)
  • 您不能将UIGestureRecognizers 与精灵一起使用,只能使用UIView。您需要从视图 -> 场景 -> 精灵进行转换,这不是这个答案所暗示的。这个答案告诉您使用精灵的UIResponder,这是您的UITouch 事件。这样做的问题是你计划拖动一个精灵,这意味着你需要离开精灵的边界来移动他,或者让精灵的边界太大以至于它必须覆盖整个屏幕。
  • 是的,使用 UIGestureRecognizer 我必须将它附加到整个 SKView,然后找出要移动的东西。真的不是那么方便。不幸的是,仅在SKScene 中使用touchesMoved 方法会导致非常缓慢、滞后的拖动。我尝试子类化SKSpriteNode 以使用响应者链(这似乎更好,因为每个精灵都会处理自己的事件)但是...无法弄清楚如何将精灵放入响应者链.正如你上面提到的。所以问题仍然存在:我如何才能顺利地拖动精灵?
  • 我可能会去使用mvids并使用Mo DeJong的图书馆。 (需要,因为我需要视频中的 Alpha 通道)。但这是一个完全不同的生产工具链。欢迎提出建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多