Search code examples
iosswiftsprite-kitskspritenodesktexture

Swift SpriteKit change background image score based


i am developing a game using Swift and SpriteKit. I want that the background changes at a certain score. Here is the code:

 class GameScene: SKScene {
 var bg = SKSpriteNode()

override func didMoveToView(view: SKView) {

   makeBg()
}

func makeBg() {

    let bgTexture = SKTexture(imageNamed: "img/bg.png")
    let moveBg = SKAction.moveByX(-bgTexture.size().width, y: 0, duration: 9)
    let replaceBg = SKAction.moveByX(bgTexture.size().width, y: 0, duration:0)
    let animateBg = SKAction.repeatActionForever(SKAction.sequence([moveBg,   replaceBg]))


    for var i: CGFloat = 0; i<3; i++ {
        let bg = SKSpriteNode(texture: bgTexture)
        bg.name = "background"
        bg.position = CGPoint(x: bgTexture.size().width/2 + bgTexture.size().width * i, y: CGRectGetMidY(self.frame))
        bg.size.height = self.frame.height
        bg.runAction(animateBg)
        addChild(bg)
    }
}     
   override func touchesBegan(touches: Set<UITouch>, withEvent event:    UIEvent?) {
     if score == 0 {
               bg.texture = SKTexture(imageNamed: "img/bg.png")
            } else if score == 3 {
                bg.texture = SKTexture(imageNamed: "img/bgOri.png")
                }
 }

But image doesn't change...where is the mistake?


Solution

  • So this is how you can change a texture on all the nodes created inside your for loop:

    class GameScene: SKScene {
        override func didMoveToView(view: SKView) {
           makeBg()
        }
    
        func makeBg() {
            let bgTexture = SKTexture(imageNamed: "img/bg.png")
            let moveBg = SKAction.moveByX(-bgTexture.size().width, y: 0, duration: 9)
            let replaceBg = SKAction.moveByX(bgTexture.size().width, y: 0, duration:0)
            let animateBg = SKAction.repeatActionForever(SKAction.sequence([moveBg,   replaceBg]))
    
            for var i: CGFloat = 0; i<3; i++ {
                let bg = SKSpriteNode(texture: bgTexture)
                bg.name = "background"
                bg.position = CGPoint(x: bgTexture.size().width/2 + bgTexture.size().width * i, y: CGRectGetMidY(self.frame))
                bg.size.height = self.frame.height
                bg.runAction(animateBg)
    
                addChild(bg)
            }
        }
    
        override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            enumerateChildNodesWithName("background", usingBlock: { node, stop in
                //Make a check based on score and
                (node as? SKSpriteNode)?.texture = //set the right texture
            })
        }
    }
    

    Note that you don't need bg property defined in the GameScene to accomplish this.