Swift:尝试添加一个已经有父节点的 SKNode:

Posted

技术标签:

【中文标题】Swift:尝试添加一个已经有父节点的 SKNode:【英文标题】:Swift: Attemped to add a SKNode which already has a parent: 【发布时间】:2016-05-09 15:16:53 【问题描述】:

我知道为什么会出现该错误,但我想不出解决办法。我试图让对象出现然后被删除,玩家应该在它们被删除之前尝试点击它们,但是每次下一个节点即将出现时它都会崩溃。如果我在它的 func 中声明它,那么它就会全部出来,但我无法点击它......

代码:

let step = SKSpriteNode()

override func didMoveToView(view: SKView) 
    physicsWorld.contactDelegate = self
    backgroundColor = UIColor.feelFreeToColor()

    self.color = self.randomNumbersInt(3)
    self.showBars()
    self.showScore()
    let spawn = SKAction.runBlock 
        //self.color = self.randomNumbersInt(3)
        self.showSteps()
    
    let delay = SKAction.waitForDuration(1.5)
    let spawnDelay = SKAction.sequence([spawn , delay])
    let spawnDelayForever = SKAction.repeatActionForever(spawnDelay)

    self.runAction(spawnDelayForever)


override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 
    for touch in touches 
        var location = touch.locationInNode(self)

        if self.nodeAtPoint(location) == step 
            self.score += 1
        
    


func showSteps() 
    let createSteps = SKAction.moveByX(0, y: -self.frame.height - 30 , duration: 10)
    let removeSteps = SKAction.removeFromParent()

    step.color = colors[randomNumbersInt(3)]!
    step.size = CGSize(width: 275, height: 30)
    step.position = CGPoint(x: self.frame.width * 0.5, y: self.frame.height * 0.75)
    step.physicsBody = SKPhysicsBody(rectangleOfSize: step.size)
    step.physicsBody?.categoryBitMask = Config.PhysicBodyType.Steps.rawValue
    step.physicsBody?.affectedByGravity = false
    step.physicsBody?.dynamic = false
    step.zPosition = 1
    step.runAction(SKAction.repeatActionForever(SKAction.sequence([createSteps, removeSteps])))

    addChild(step)

【问题讨论】:

Related. 在发布之前我已经看到了,甚至不是同一个问题。我知道,如果我想重新添加相同的 sknode,我必须在函数中声明所有内容,但我需要在该函数之外访问它,同时它正在创建和删除 sknode...@Gliderman 【参考方案1】:

在您的showSteps 函数中,在其中声明step 节点,而不是在您的代码顶部,同时给它一个name

func showSteps() 
    let step = SKSpriteNode()
    ...
    step.name = "step"
    step.color = colors[randomNumbersInt(3)]!
    // etc

在你的touchesBegan 方法中,你有这个if 声明:

if self.nodeAtPoint(location) == step 
     self.score += 1

你想删除你点击的那个节点,但现在你可以像这样检查name属性:

if self.nodeAtPoint(location)?.name == "step" 
    self.nodeAtPoint(location)?.removeFromParent()
    self.score += 1

请注意,我对 Swift 不是超级流利,但我认为您可能需要在您的 if 语句中使用 ?,因为它可能不存在(例如,如果您没有点击特定节点)。更熟悉 Swift 的人可以免费纠正我。

【讨论】:

是否可以访问颜色等其他属性?如果我点击我希望它改变颜色。 @MohamedMohamed 应该是,不过我现在无法测试。 在哪里可以找到更多相关信息?对 swift 来说相当新。我需要访问该 sknode(感谢您!)并让它与它的颜色相同。 @MohamedMohamed 好吧,here is Apple's documentation on SKSpriteNodes。 *** 并不是一个真正的推荐网站,但有数百(数千?)关于 Swift 的教程,您可能能够通过仔细措辞您想要了解的内容,在网络搜索中缩小范围。跨度> 感谢您的帮助!我会从这里开始搜索。

以上是关于Swift:尝试添加一个已经有父节点的 SKNode:的主要内容,如果未能解决你的问题,请参考以下文章

Swift SpriteKit - “尝试添加一个已经有父节点的 SKNode”,同时添加关节

错误:尝试添加已经有父节点的 SKNode

尝试添加一个已经有父节点的 SKNode

尝试添加已经有父节点的 SKNode

尝试添加一个已经有父错误的 SKNode

SpriteKit: NSInvalidArgumentException - 试图添加一个已经有父节点的 SKNode