【问题标题】:Is it acceptable to create an SKShapeNode in update delegate?在更新委托中创建 SKShapeNode 是否可以接受?
【发布时间】:2020-03-05 13:47:16
【问题描述】:

我在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)
    }
}

【问题讨论】:

  • “或者没问题”每十分之一秒添加一个新孩子怎么可能没问题?
  • 更新函数是 SpriteKit 游戏循环的一部分,它不是委托。就像我在你的其他帐户上告诉你的那样@MarcTornej
  • 您没有以正确的方式解决您的问题。旋转不应导致您的节点移动。如果您打算同时支持两个方向,我建议您使用方形场景。

标签: ios swift sprite-kit device-orientation skshapenode


【解决方案1】:

是的,您可以创建。您遇到的唯一问题是每次调用 update 时都会创建一个新节点。目前,您看不到多个节点,因为如果您尝试在每次更新调用中更改 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 的位置将使您有机会看到被添加到屏幕上不同位置的节点。

如果出于任何原因您想在 update 中创建 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"

那就不要再添加了

【讨论】:

  • 非常感谢您提供的信息!知道如何解决跳跃方块问题吗?不知道如何处理那个问题,或者一开始它为什么会发生。
  • 我认为 load 在调用时还没有计算出正确的或最终的视图帧
【解决方案2】:

update 函数上做任何事情都是个坏主意

苹果文档:

不要直接调用这个方法;只要场景在视图中呈现并且没有暂停,它就会被系统每帧调用一次。这是动画场景时调用的第一个方法,在评估任何动作之前以及在模拟任何物理之前。

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

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

但可能无限创建几个节点是个坏主意。

【讨论】:

  • 感谢您的信息,知道如何解决跳跃方块的问题吗?
  • 我真的不明白跳方块的问题。这可能是另一个原因,就像现在的场景一样。 (stackoverflow.com/questions/60542976/…)
  • 不,这很奇怪。谢谢@Maetschl,我会查看链接:)
  • 说“在更新函数上做任何事情都是一个坏主意”是一种误导。 Apple 文档的评论只是意味着您不应该直接调用它,因为 SpriteKit 正在为您调用它。但是对于每一帧开始时需要做的任何事情,它都是合适的地方。
猜你喜欢
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多