Swift:尝试添加已经拥有父级的SKNode:

时间:2016-05-09 15:16:54

标签: swift sprite-kit sknode

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

1 个答案:

答案 0 :(得分: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的人可以自由地纠正我。