在更新委托中创建 SKShapeNode 是否可以接受?

Is it acceptable to create an SKShapeNode in update delegate?

我在 SpriteKit's update delegate 中创建了一个 SKShapeNode,它完全按照我想要的方式工作。我唯一担心的是 update 每十分之一秒被调用一次。这是否意味着我的代码也经常 运行?这似乎对性能不太友好。有办法解决吗?或者将代码放在 update 上可以吗?

为什么update中的代码排在第一位你可能会问。好吧,如果我把它放在 didMovesceneDidLoad 中,那么当我旋转 device 时,node 不会立即跟随,它会在原来的位置停留半秒钟在重新定位到它的新位置之前,让它看起来像在跳跃。坏的。 Update 解决了这个问题。这是代码:

    override func update(_ currentTime: TimeInterval) {
        let mySquare = SKShapeNode(rectOf: CGSize(width: 50, height: 50))
        mySquare.fillColor = SKColor.blue
        mySquare.lineWidth = 1

        mySquare.position = CGPoint(x: 0, y: 0)
        self.addChild(mySquare)
    }
}

是的,您可以创建。您遇到的唯一问题是每次调用更新时都会创建一个新节点。目前您看不到多个节点,因为如果您尝试在每次更新调用中更改 mySquare 的位置,您会将它们放置在彼此之上,您会看到您有多个节点。创建后很快就会 运行 超出帧率。因为你没有任何动画,所以你现在看不出有什么不同。

override func update(_ currentTime: TimeInterval) {
    let mySquare = SKShapeNode(rectOf: CGSize(width: 50, height: 50))
    mySquare.fillColor = SKColor.blue
    mySquare.lineWidth = 1

    mySquare.position = CGPoint(x: randomX, y: randomY)
    self.addChild(mySquare)
}

改变 X 和 Y 的位置将使您有机会看到节点被添加到屏幕上的不同位置。

如果出于任何原因您想在 更新 中创建您的 mySquare 节点,那么您可以保留该节点的引用或在父节点中搜索该节点(如果可用)不要添加任何

var mySquare: SKShapeNode

然后在更新中检查你的 Square 节点是否不为 nil 或具有相同的

override func update(_ currentTime: TimeInterval) {
    if mySquire == nil {
      mySquare = SKShapeNode(rectOf: CGSize(width: 50, height: 50))
      mySquire.name = "your square name"
      mySquare.fillColor = SKColor.blue
      mySquare.lineWidth = 1

       mySquare.position = CGPoint(x: randomX, y: randomY)
       self.addChild(mySquare)
   }
}

注意:您甚至可以检查名称,例如

if mySquare.name == "your square name"

那就不要再添加了

更新 功能上做任何事都是个坏主意

A​​pple 文档:

Do not call this method directly; it is called by the system exactly once per frame, so long as the scene is presented in a view and is not paused. This is the first method called when animating the scene, before any actions are evaluated and before any physics are simulated.

如果你想创建对象并控制它们,你应该使用例如didMove func。您可以创建这样的操作 例如:

self.run(
    SKAction.repeatForever(
        SKAction.customAction(withDuration: 0.0, actionBlock: { (_, _) in
            // Create and add new node...
        })
    )
)

但是无限创建多个节点可能不是一个好主意。