我应该在 init 方法中还是在 didMove(toView:) 中以编程方式设置 SKScene?

Posted

技术标签:

【中文标题】我应该在 init 方法中还是在 didMove(toView:) 中以编程方式设置 SKScene?【英文标题】:Should I set up a SKScene programmatically in the init method or in didMove(toView:)? 【发布时间】:2017-03-23 15:43:18 【问题描述】:

我应该在 init 方法还是在 didMove(toView:) 中以编程方式设置 SKScene(即创建子节点、将子节点添加到当前场景、布局等)?

【问题讨论】:

Whats the correct way, using "init" or "didmove"?的可能重复 init 用于初始化。但在场景的初始化中,self.view 为 nil。如果您需要任何计算的视图,您应该使用 didMove(toView:) 【参考方案1】:

是的,您的节点的初始化应该在“init”中进行。这是视图的初始设置发生的地方,这涉及创建SKNodes 并将此节点设置到它们的位置。如果您想将任何其他属性应用于节点,则可以在 sceneDidMove 中进行此一次性设置以查看。

例子

    class GameScene : SKScene 
       var player : SKSpriteNode?

           override init(size: CGSize) 
            let playerSize = CGSize(width: 30, height: 60)
            self.player = SKSpriteNode((texture: nil, color: .cyan, size: playerSize) 
            self.addChild(player)
            player.position.x  = size.width / 2
            player.position.y = size.height / 2
            player.zPosition = 99

            super.init(size: size)
            // you can only call functions after super.init

        

    override func sceneDidLoad() 
    //setup Code

        

    

【讨论】:

以上是关于我应该在 init 方法中还是在 didMove(toView:) 中以编程方式设置 SKScene?的主要内容,如果未能解决你的问题,请参考以下文章

何时使用 sceneDidLoad v didMove(查看:)

初始化发生在哪里,在 init 方法中还是在实例声明中?

我应该把 AutoLayout 代码放在哪里?

iPhone - 我应该如何编写一个 init 方法?

为啥将 [super init] 放在 if 语句中,因为无论返回是不是为 nil,我们还是返回它?

试图建立平台,我可以从下面跳过,但降落在上面。难以微调逻辑