Ios 创建SKScene,init(文件名:)vs init(大小:)

Ios 创建SKScene,init(文件名:)vs init(大小:),ios,swift,sprite-kit,initialization,skscene,Ios,Swift,Sprite Kit,Initialization,Skscene,如果在Xcode中创建新的游戏模板项目,默认的GameViewController将使用以下初始值设定项来实例化游戏场景: let scene = SKScene(fileNamed: "GameScene") 初始化器在模板文件中的使用表明,这是苹果公司推荐的创建SKScene的方法。但是,我看到了许多关于堆栈溢出的示例,它们使用init(size:)初始值设定项或简单地使用SKScene() 我想知道创建SKScene实例的最佳方法是什么,每种方法的优缺点是什么,以及使用一种方法与另一种方

如果在Xcode中创建新的游戏模板项目,默认的
GameViewController
将使用以下初始值设定项来实例化游戏场景:

let scene = SKScene(fileNamed: "GameScene")
初始化器在模板文件中的使用表明,这是苹果公司推荐的创建
SKScene
的方法。但是,我看到了许多关于堆栈溢出的示例,它们使用
init(size:)
初始值设定项或简单地使用
SKScene()

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

我问这个问题的原因是我使用了
init(filename:)
来创建我的游戏场景和构建级别1。后来我尝试使用
init(size:)
为level 2创建另一个场景实例时,遇到了问题。也就是说,如果我使用
init(大小:)
而不是
init(文件名:)
创建场景,则使用
UIScreen
和场景帧进行的一些位置计算似乎会产生不同的结果


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

我强烈建议不要使用
init(大小:)
在创建游戏中使用的场景时。你真的应该试着把设计和结构分开。这允许您在不更改任何代码的情况下更改游戏的布局,从而减少出现bug的可能性

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

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


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

我没有完整的答案,但我使用了名为重载的文件,这是可以的,然后我缓存了场景以便于导航部分问题可能是init(size:)将使用不同的默认值进行初始化,与使用init(filename:)从文件加载的场景相比,这与您预期的不同。例如,场景大小将根据传入的内容而有所不同。您的场景将具有不同的名称。它可能是SKScene的另一个子类。它的主播点可能不在同一个地方。等等,很好。在我的问题中,我提到了使用
init(大小:)
而不是
init(文件名:)
如何导致我的一个精灵的坐标混乱。。。原因很可能是你提到的坐标冲突的危险。谢谢是的,你列出的问题可能有很多种。我始终建议使用场景文件(sks)并将场景设置为正方形大小,这样您可以针对所有纵横比进行开发,并让系统进行裁剪。当然,你需要做数学来处理叠加,但是这个数学只做一次就可以节省大量的时间。