在didBeginContact中更改单个节点的纹理

时间:2016-10-18 13:53:51

标签: swift sprite-kit

我创造了一个简单的游戏,我将比赛悬停在蜡烛上(奇怪的描述适合我的问题),当比赛与灯芯接触时,球员得分。但是,如果它接触到任何其他东西(如蜡烛的'蜡'部分),游戏就结束了。玩家通过点击屏幕来控制匹配。

我的蜡烛,作为灯芯和彩色部分,创建如下(我删除了不相关的部分,如随机纹理系列):

    func makeCandles() {

    //Node properties and randomisation
    let candle = SKNode()
    let randomCandle = Int(arc4random_uniform(UInt32(candleTexture.count)))
    let randomTexture = candleTexture[randomCandle] as SKTexture
    let random = arc4random_uniform(17)
    candle.position = CGPoint(x: self.frame.size.width, y: CGFloat(random * 12) - 120)

    //Candle
    let chosenCandle = SKSpriteNode(texture: randomTexture)
    chosenCandle.position = CGPoint(x: 0, y: self.frame.size.height / 2)
    chosenCandle.physicsBody = SKPhysicsBody(rectangleOfSize: chosenCandle.size)
    chosenCandle.physicsBody?.dynamic = false
    chosenCandle.physicsBody?.categoryBitMask = self.candleCategory
    chosenCandle.physicsBody?.contactTestBitMask = self.matchCategory
    chosenCandle.physicsBody?.collisionBitMask = 0
    chosenCandle.physicsBody?.restitution = 0
    candle.addChild(chosenCandle)

    //Wick
    let wickArea = SKSpriteNode(texture: wickTexture)
    wickArea.name = "wickNode"
    wickArea.position = CGPoint(x: 0, y: self.frame.size.height / 1.3)
    wickArea.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: wickArea.size.width / 4, height: wickArea.size.height))
    wickArea.physicsBody?.dynamic = false
    wickArea.physicsBody?.categoryBitMask = self.wickCategory
    wickArea.physicsBody?.contactTestBitMask = self.matchCategory
    wickArea.physicsBody?.collisionBitMask = 0
    wickArea.zPosition = 11
    wickArea.physicsBody?.restitution = 0
    candle.addChild(wickArea)

    //Add the node and zPosition
    self.partsMoving.addChild(candle)
    chosenCandle.zPosition = 12
}

然后在runBlock中创建蜡烛:

    let createCandles = SKAction.runBlock({() in self.makeCandles()})
    let briefPause = SKAction.waitForDuration(averageDelay, withRange: randomDelay)
    let createAndPause = SKAction.sequence([createCandles, briefPause])
    let createAndPauseForever = SKAction.repeatActionForever(createAndPause)
    self.runAction(createAndPauseForever)

这是我的函数,它改变了在didBeginContact中调用的纹理:

 func updateFlame() {

    if let newNode: SKNode = self.childNodeWithName("//wickNode") {
        let updateTexture = SKAction.setTexture(flameTexture, resize: true)
        newNode.runAction(updateTexture)

    }

}

这是我的didBeginContact函数:

 func didBeginContact(contact: SKPhysicsContact) {

    if contact.bodyA.categoryBitMask == wickCategory || contact.bodyB.categoryBitMask == wickCategory {
        score += 1
        scoreLabel.text = "\(score)"
        updateFlame()

    } else {
        runGameOverScene()
    }

我的问题是它只将第一个节点更改为火焰,并且不会更改任何其他节点。即使它是检测到接触的第二或第三个灯芯,也只更改第一个创建的灯芯(第一个灯泡通过屏幕)。我知道在每个节点上都检测到了联系人并且这种方式正常,因为每次匹配与灯芯接触时分数都会更新。

我做错了什么是停止单独接触匹配的每个节点的纹理?其他一切工作都很好,但这部分让我打了一个星期,我尝试过的一切都行不通。这是我得到的最接近的。

1 个答案:

答案 0 :(得分:1)

经过多次反复试验,我终于想出了如何在发生接触时让每个节点改变纹理!这是我的代码:

func didBeginContact(contact: SKPhysicsContact) {

    let collision : UInt32 = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask)

    if collision == (matchCategory | candleCategory | cakeCategory) {
        runGameOverScene()
    }

    if (contact.bodyA.categoryBitMask == wickCategory) {
        let newWick = contact.bodyA.node
        let updateTexture = SKAction.setTexture(flameTexture, resize: true)
        newWick!.runAction(updateTexture)

    } else if (contact.bodyB.categoryBitMask == wickCategory) {
        let newWick = contact.bodyB.node
        let updateTexture = SKAction.setTexture(flameTexture, resize: true)
        newWick!.runAction(updateTexture)
    }

}

我遵循了这个问题的逻辑(即使我想设置纹理,而不是删除它)并且它完美地工作:removeFromParent() Doesn't Work in SpriteKit