2017-03-19 1 views
2

J'ai une image de fond dans mon application qui se déplace de haut en bas et se répète. Je souhaite qu'une image différente apparaisse sur l'écran après x temps.Swift Game Scène changer de fond avec le temps ou le score?

Serait-ce le cas?

Quand serait-il préférable d'enlever le bg initial pour éviter trop de couches?

override func didMove(to view: SKView) { 

    let bgTexture = SKTexture(imageNamed: "bg1.png") 
    let moveBGanimation = SKAction.move(by: CGVector(dx: 0, dy: -bgTexture.size().height), duration: 4) 
    let shiftBGAnimation = SKAction.move(by: CGVector(dx: 0, dy: bgTexture.size().height), duration: 0) 
    let moveBGForever = SKAction.repeatForever(SKAction.sequence([moveBGanimation, shiftBGAnimation])) 

    var i: CGFloat = 0 

    while i < 3 { 

     bg = SKSpriteNode(texture: bgTexture) 
     bg.position = CGPoint(x: self.frame.midX, y: bgTexture.size().height * i) 
     bg.size.width = self.frame.width 
     bg.zPosition = -2 

     bg.run(moveBGForever) 
     self.addChild(bg) 

     i += 1 


    } 

    bg2Timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(self.moveBG2), userInfo: nil, repeats: false) 

} 

func moveBG2() { 

    let bg2Texture = SKTexture(imageNamed: "bg2.png") 
    let moveBG2animation = SKAction.move(by: CGVector(dx: 0, dy: -bg2Texture.size().height * 2), duration: 8) 
    let shiftBG2Animation = SKAction.move(by: CGVector(dx: 0, dy: bg2Texture.size().height), duration: 0) 
    let moveBG2Forever = SKAction.repeatForever(SKAction.sequence([moveBG2animation, shiftBG2Animation])) 

    var j: CGFloat = 0 

    while j < 3 { 

     bg2 = SKSpriteNode(texture: bg2Texture) 
     bg2.position = CGPoint(x: self.frame.midX, y: bg2Texture.size().height + bg2Texture.size().height * j) 
     bg2.size.width = self.frame.width 
     bg2.zPosition = -1.5 


     bg2.run(moveBG2Forever) 
     self.addChild(bg2) 

     j += 1 


    } 



} 

Répondre

3

Voici une idée que j'ai trouvée.

Refactor ce morceau de code:

let bgTexture = SKTexture(imageNamed: "bg.png") 
    let moveBGanimation = SKAction.move(by: CGVector(dx: 0, dy: -bgTexture.size().height), duration: 4) 
    let shiftBGAnimation = SKAction.move(by: CGVector(dx: 0, dy: bgTexture.size().height), duration: 0) 
    let moveBGForever = SKAction.repeatForever(SKAction.sequence([moveBGanimation, shiftBGAnimation])) 

à une méthode:

func runBgActions(bgTextureName: String) { 
    let bgTexture = SKTexture(imageNamed: bgTextureName) 
    bg.texture = bgTexture 
     let moveBGanimation = SKAction.move(by: CGVector(dx: 0, dy: -bgTexture.size().height), duration: 4) 
     let shiftBGAnimation = SKAction.move(by: CGVector(dx: 0, dy: bgTexture.size().height), duration: 0) 
     let moveBGForever = SKAction.repeatForever(SKAction.sequence([moveBGanimation, shiftBGAnimation])) 
    bg.removeAllActions() 
    bg.run(moveBGForever) 
} 

Ensuite, créez une autre action et l'exécuter sur un noeud qui est pas bg, peut-être la scène elle-même.

let bg1Action = SKAction.run { runBgActions(bgTextureName: "bg1") } 
let bg2Action = SKAction.run { runBgActions(bgTextureName: "bg2") } 
let bg3Action = SKAction.run { runBgActions(bgTextureName: "bg3") } 
let waitAction = SKAction.wait(forDuration: 10) 
let sequence = SKAction.sequence([bg1Action, waitAction, bg2Action, waitAction, bg3Action, waitAction]) 
let repeatForeverAction = SKAction.repeatForever(sequence) 
self.run(repeatForeverAction) // assuming self is the scene here 

Une autre approche serait d'utiliser SKAction.group pour exécuter les actions de fond d'attente et le déplacement en même temps, mais je trouve que pour mettre en œuvre tout à fait contre-intuitif.

Après avoir vu votre code, ce que j'ai pu venir avec:

var bg = SKSpriteNode() 

func runBgActions(bgTextureName: String) { 
    let bgTexture = SKTexture(imageNamed: bgTextureName) 
    bg.texture = bgTexture 
    bg.position = CGPoint(x: self.frame.minX, y: self.frame.minY) 
    let moveBGanimation = SKAction.move(by: CGVector(dx: 0, dy: -(bgTexture.size().height - self.frame.height)), duration: 4) 
    let shiftBGAnimation = SKAction.move(by: CGVector(dx: 0, dy: bgTexture.size().height - self.frame.height), duration: 0) 
    let moveBGForever = SKAction.repeatForever(SKAction.sequence([moveBGanimation, shiftBGAnimation])) 
    bg.removeAllActions() 
    bg.run(moveBGForever) 
} 

override func didMove(to view: SKView) { 
    var i: CGFloat = 0 

    bg = SKSpriteNode(imageNamed: "bg1") // replace this with your first background's texture name 
    bg.position = CGPoint(x: self.frame.minX, y: self.frame.minY) 
    bg.anchorPoint = CGPoint(x: 0, y: 0) 
    bg.size.width = self.frame.width 
    bg.zPosition = -2 
    self.addChild(bg) 

    i += 1 
    let bg1Action = SKAction.run { self.runBgActions(bgTextureName: "bg1") } 
    let bg2Action = SKAction.run { self.runBgActions(bgTextureName: "bg2") } 
    let bg3Action = SKAction.run { self.runBgActions(bgTextureName: "bg3") } 
    let waitAction = SKAction.wait(forDuration: 10) 
    let sequence = SKAction.sequence([bg1Action, waitAction, bg2Action, waitAction, bg3Action, waitAction]) 
    let repeatForeverAction = SKAction.repeatForever(sequence) 
    self.run(repeatForeverAction) 
} 
+0

Cela ressemble beaucoup @Sweeper Je suis juste en difficulté la mise en œuvre correctement. Je ne sais pas trop où placer chaque bit de code? Et quel ordre pour le moment. Je vais continuer à faire bouger les choses et je suis sûr que je vais y arriver. Merci! –

+0

Je pense que c'est presque correct. S'il vous plaît voir la question révisée. J'ai besoin de déclarer bgTexture quelque part en dehors de la fonction je pense que je reçois erreur "Utilisation de l'identificateur non résolu" bgTexture "" –

+0

@AlexIngram Je pense que c'est parce que le nom du paramètre en conflit avec la variable locale. Édité maintenant. – Sweeper