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

Swift: Attemped to add a SKNode which already has a parent:

我知道为什么会出现该错误,但我想不出解决方法。我试图让物体出现然后被移除,玩家应该在它们被移除之前尝试点击它们,但每次下一个节点即将出现时它都会崩溃。如果我在它的 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)
}

在你的 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 的人可以免费纠正我。