2016-03-05 4 views
2

Я развиваю игру с помощью Swift и SpriteKit. Я хочу, чтобы фон менялся с определенной оценкой. Вот код:Swift SpriteKit сменить фоновое изображение на основе

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") 
       } 
} 

Но изображение не меняется ... где ошибка?

+1

Вы проверили, действительно ли код внутри этого блока if/else? Кроме того, вы используете 'bgTexture' и' bg.texture' внутри своих touchhesBegan ... Это выглядит подозрительно ... – Whirlwind

+0

Да, код выполнен ... проблема в том, что я не могу изменить фоновое изображение во время работы сцены. ..пожалуйста помогите. Я могу изменить фоновое изображение только в том случае, если полностью изменить свой код ... объявляя var bg = SKSpriteNode (imageNamed: "img/bg.png") в gamescene ..., но оставляя статический фон без прокрутки. – Swift1

+1

Хорошо, это начало. Позвольте мне попытаться воссоздать проблему ... Видите ли вы, случайно, что в какой-то момент изображение MissingResource (белая коробка с красным X в нем)? – Whirlwind

ответ

2

Так это, как вы можете изменить текстуру на всех узлах, созданных внутри вашей цикл:

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 
     }) 
    } 
} 

Обратите внимание, что вам не нужно BG свойства, определенные в GameScene для достижения этой цели.

+0

Работает отлично! Я очень благодарен за то, что вы сделали для меня. Большое спасибо – Swift1

Смежные вопросы