【问题标题】:Create Array of SKShapeNodes. Swift > Xcode 6创建 SKShapeNode 数组。斯威夫特 > Xcode 6
【发布时间】:2014-12-10 18:59:54
【问题描述】:

在 swift 中,下面的代码以一定的速率(每秒 2 次)从 didMoveToView() 调用。每次调用此函数时,屏幕上都会出现一个新的 circlenode。但是,当它尝试添加第二个时,它不会继续添加它们,而是会引发错误:尝试添加已经有父级的sknode。我发现你不能在同一个视图上创建一个重复的节点。考虑到这一点,我得出的结论是,我需要创建一个 SKShapeNodes 数组,因此每当调用该函数时,它都会从数组中取出一个并将其添加到视图中。在我的例子中,当一个节点到达底部(y = -20)时,它需要删除该节点,并使其再次可用。

所以,我的问题是:如何创建一个SKShapeNodes 数组,所以当我下面的函数被调用时,它将采用一个新节点并将其显示到视图中?此外,当节点退出视图时,需要使节点再次可用。

let circlenode = SKShapeNode(circleOfRadius: 25) //GLOBAL

func thecircle() {
    circlenode.strokeColor = UIColor.whiteColor()
    circlenode.fillColor = UIColor.redColor()

    let initialx = CGFloat(20) 
    let initialy = CGFloat(1015)

    let initialposition = CGPoint(x: initialx, y: initialy)
    circlenode.position = initialposition


    self.addChild(circlenode)

    let action1 = SKAction.moveTo(CGPoint(x: initialx, y: -20), duration: NSTimeInterval(5)) 
    let action2 = SKAction.removeFromParent()
    circlenode.runAction(SKAction.sequence([action1, action2]))
}

【问题讨论】:

    标签: swift sprite-kit


    【解决方案1】:

    所以你说得对,上面代码的问题是SKNode 只能有一个父级。

    您可以采取 2 种方法。

    1. 创建SKShapeNodes 的数组
    2. 根据需要创建一个新的SKShapeNode

    前者的限制是你需要密切关注你的圈子总数,否则你会超出你的界限。如果您删除项目,这也意味着对其进行会计处理。后者有在您需要时生成SKShapeNode 的开销。这很可能不会成为问题。

    要创建数组,您需要执行以下操作(选项 1):

    var circleArray:[SKShapeNode] = [SKShapeNode]() // Property in your class
    
    // Code in your init or wherever else you want, depending on what class this is.
    // 10 is just an arbitrary number
    for var i=0;i<10;i++ {
        circleArray.append(SKShapeNode(circleOfRadius: 25))
    }
    

    当您想将其添加到您的 thecircle 时,您在其中调用 self.addChild(circlenode) 类似:

    if numCircles < circleArray.count {
        SKShapeNode *circlenode = circleArray[numCircles]
    
        // Do other initialization here
    
        self.addChild(circlenode)
        numCircles++
    }
    

    或者你可以这样做(选项 2):

    SKShapeNode *circlenode = SKShapeNode(circleOfRadius: 25)
    
    // Do other initialization here
    
    self.addChild(circle node)
    

    我可能会执行选项 2,以便不必处理阵列中未完成圆圈数量的任何管理。如果您删除了圈子并想要回收它们,这一点尤其重要。

    【讨论】:

    • 非常感谢您的详细回复!我将在本周的某个时候快速测试这段代码,并告诉你它是如何进行的!
    • 太棒了!选项 1 实际上对我来说效果更好:) 非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2017-03-24
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    相关资源
    最近更新 更多