【问题标题】:Creating SKScene, init(fileNamed:) vs init(size:)创建 SKScene,init(fileNamed:) vs init(size:)
【发布时间】:2017-11-14 02:49:32
【问题描述】:

如果你在 Xcode 中新建一个游戏模板项目,默认的GameViewController 会使用下面的初始化器来实例化游戏场景:

let scene = SKScene(fileNamed: "GameScene")

模板文件中使用的初始化程序表明这是 Apple 推荐的创建 SKScene 的方法。但是,我在 Stack Overflow 上看到了很多使用 init(size:) 初始化器或简单地使用 SKScene() 的示例。

我想知道哪种方法是创建SKScene 实例的最佳方法,每种方法的优缺点是什么,以及在使用一种方法与另一种方法时要注意的各种缺陷。

我问的原因是我使用init(fileNamed:) 来创建我的游戏场景并构建关卡 1。当我后来尝试使用init(size:) 为关卡 2 创建另一个场景实例时,我遇到了问题。也就是说,如果我使用init(size:) 而不是init(fileNamed:) 创建场景,使用UIScreen 和场景框架的一些位置计算似乎会产生不同的结果。

在更一般的意义上,我想听听非常熟悉使用 iOS 和 SpriteKit 的人关于他们初始化新 SKScene 的首选方式以及使用不同方法的优缺点的意见。

【问题讨论】:

  • 我没有完整的答案,但我使用了 fileNamed 重载,没关系,然后我缓存了场景以便于导航
  • 部分问题可能是与使用 init(fileNamed:) 从文件加载的场景相比,init(size:) 将使用不同于您预期的默认值进行初始化。例如,您的场景大小会根据您传入的内容而有所不同。您的场景将有不同的名称。它可能是 SKScene 的不同子类。它的锚点可能不在同一个地方。等等。

标签: ios swift sprite-kit initialization skscene


【解决方案1】:

在创建用作游戏一部分的场景时,我强烈建议不要使用init(size:)。您确实应该尝试将设计与结构分开。这允许您在不更改任何代码的情况下更改游戏的布局方式,从而减少出现错误的可能性。

话虽如此,有一个非常常见的练习教程使用看起来像这样init(size:view.size)。这给游戏设计师带来了各种各样的麻烦,并破坏了 SpriteKit 提供的对多种设备的简单处理。人们倾向于在 0..1 坐标系中结束,在定位节点时在任何地方放置分隔线,这也会导致错误,因为人们最终可能会忘记某处的分隔线,或者在他们的意思是高度时使用宽度。

SKScenes 有 4 种缩放模式,用于处理场景在每台设备上的外观,使用此工具开发游戏时应始终考虑到这一点。它真的应该是首先被讨论的事情,这样人们才能理解它背后的力量。

我建议使用init(size:) 的唯一情况是当您需要创建无法通过 sprite kit 构建器实现的动态场景时,并且当您已经建立了静态大小的窗口时。

【讨论】:

  • 非常好。在我的问题中,我提到了如何使用init(size:) 而不是init(fileNamed:) 导致我的一个精灵的坐标变得混乱......原因很可能是由于您提到的坐标冲突的危险。谢谢!
  • 是的,您列出的问题可能是任意数量的。我总是建议使用场景文件 (sks) 并将场景设置为正方形大小,这样您就可以针对所有纵横比进行开发并让系统进行裁剪。当然,您需要进行数学运算来处理叠加层,但这种数学运算只需要完成一次即可为您节省大量时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 2018-09-22
  • 2017-04-04
相关资源
最近更新 更多