2016-07-12 7 views
0

Ich versuche, einen Parallaxen-Wolkeneffekt mit verschiedenen Geschwindigkeiten und Größen zu erzeugen, aber ich habe Schwierigkeiten beim Hinzufügen einer anderen Y-Koordinate, nicht immer im selben Y für alle Wolken.Erzeuge Parallaxenwolken mit zufälliger Y-Koordinate mit SKSpriteNode und SKAction in Swift

Also habe ich 5 Wolken, mit ihren jeweiligen X-und Y-Koordinaten, und ich verwende die SKAction.moveByX() -Funktion.

Alle Wolken beginnen beispielsweise bei FRAME_WIDTH + 200 (außerhalb der Grenzen) und enden bei -100. Danach setze ich das X auf FRAME_WIDTH + 200 zurück und mache eine "forever" Sequenz. Das funktionierte perfekt, aber ich möchte jedes Mal, wenn die Animation beendet ist, eine zufällige Y-Koordinate hinzufügen. Ich konnte es tun, aber das würde nur einmal die Y-Koordinate ändern.

Wie kann ich das erreichen?

Hier ist mein aktueller Code:

func addClouds() { 

     let cloud1 = SKSpriteNode(imageNamed: "cloud1") 
     let cloud2 = SKSpriteNode(imageNamed: "cloud2") 
     let cloud3 = SKSpriteNode(imageNamed: "cloud3") 
     let cloud4 = SKSpriteNode(imageNamed: "cloud4") 
     let cloud5 = SKSpriteNode(imageNamed: "cloud5") 

     cloud1.zPosition = ZIndexPosition.CLOUD 
     cloud1.position = CGPoint(x: self.FRAME_WIDTH - 100, y: self.FRAME_HEIGHT/2 - 150) 
     cloud1.size = CGSize(width: 44, height: 14) 

     cloud2.zPosition = ZIndexPosition.CLOUD 
     cloud2.position = CGPoint(x: self.FRAME_WIDTH + 150, y: self.FRAME_HEIGHT - 100) 
     cloud2.size = CGSize(width: 104, height: 16) 

     cloud3.zPosition = ZIndexPosition.CLOUD 
     cloud3.position = CGPoint(x: self.FRAME_WIDTH - 50, y: self.FRAME_HEIGHT - 200) 
     cloud3.size = CGSize(width: 8, height: 6) 

     cloud4.zPosition = ZIndexPosition.CLOUD 
     cloud4.position = CGPoint(x: self.FRAME_WIDTH + 200, y: self.FRAME_HEIGHT/2 - 50) 
     cloud4.size = CGSize(width: 116, height: 32) 

     cloud5.zPosition = ZIndexPosition.CLOUD 
     cloud5.position = CGPoint(x: self.FRAME_WIDTH, y: self.FRAME_HEIGHT - 250) 
     cloud5.size = CGSize(width: 24, height: 6) 


     let resetCloud1YPos = SKAction.moveToY(self.randomCloud1, duration: 0) 
     let resetCloud2YPos = SKAction.moveToY(self.randomCloud2, duration: 0) 
     let resetCloud3YPos = SKAction.moveToY(self.randomCloud3, duration: 0) 
     let resetCloud4YPos = SKAction.moveToY(self.randomCloud4, duration: 0) 
     let resetCloud5YPos = SKAction.moveToY(self.randomCloud5, duration: 0) 

     let resetCloud1Pos = SKAction.moveToX((self.FRAME_WIDTH * 2) - 100, duration: 0) 
     let resetCloud2Pos = SKAction.moveToX((self.FRAME_WIDTH * 2) - 150, duration: 0) 
     let resetCloud3Pos = SKAction.moveToX((self.FRAME_WIDTH * 2) - 50, duration: 0) 
     let resetCloud4Pos = SKAction.moveToX((self.FRAME_WIDTH * 2) - 200, duration: 0) 
     let resetCloud5Pos = SKAction.moveToX((self.FRAME_WIDTH * 2) - 20, duration: 0) 

     let moveCloud1 = SKAction.moveToX(-100, duration: 28) 
     let cloud1Sequence = SKAction.sequence([moveCloud1, resetCloud1Pos, resetCloud1YPos]) 
     let cloud1Forever = SKAction.repeatActionForever(cloud1Sequence) 

     let moveCloud2 = SKAction.moveToX(-100, duration: 24) 
     let cloud2Sequence = SKAction.sequence([moveCloud2, resetCloud2Pos, resetCloud2YPos]) 
     let cloud2Forever = SKAction.repeatActionForever(cloud2Sequence) 

     let moveCloud3 = SKAction.moveToX(-100, duration: 35) 
     let cloud3Sequence = SKAction.sequence([moveCloud3, resetCloud3Pos, resetCloud3YPos]) 
     let cloud3Forever = SKAction.repeatActionForever(cloud3Sequence) 

     let moveCloud4 = SKAction.moveToX(-100, duration: 13) 
     let cloud4Sequence = SKAction.sequence([moveCloud4, resetCloud4Pos, resetCloud4YPos]) 
     let cloud4Forever = SKAction.repeatActionForever(cloud4Sequence) 

     let moveCloud5 = SKAction.moveToX(-100, duration: 18) 
     let cloud5Sequence = SKAction.sequence([moveCloud5, resetCloud5Pos, resetCloud5YPos]) 
     let cloud5Forever = SKAction.repeatActionForever(cloud5Sequence) 

     cloud1.runAction(cloud1Forever) 
     cloud2.runAction(cloud2Forever) 
     cloud3.runAction(cloud3Forever) 
     cloud4.runAction(cloud4Forever) 
     cloud5.runAction(cloud5Forever) 

     self.addChild(cloud1) 
     self.addChild(cloud2) 
     self.addChild(cloud3) 
     self.addChild(cloud4) 
     self.addChild(cloud5) 

    } 

randomCloud1,2,3,4 und 5 ist nur eine zufällige Generation innerhalb der Bildschirmhöhe Grenzen.

Vielen Dank im Voraus.

Antwort

2

Wenn ich verstehe, was Sie versuchen, Sie zu erreichen, sollte der folgende Code helfen:

// ViewController.swift 

import SpriteKit 

    class GameScene: SKScene { 

    override func didMoveToView(view: SKView) { 


     //create and position a test SKSpriteNode 
     let cloud = SKSpriteNode() 
     cloud.color = SKColor.blueColor() 
     cloud.position = CGPoint(x: self.frame.size.width - 100, y: 400) 
     cloud.size = CGSize(width: 44, height: 14) 
     self.addChild(cloud) 

     //pass the SKSpriteNode into the moveNode function 
     self.moveNode(cloud) 
    } 

    //reposition the node 
    func repositionNode(node: SKSpriteNode) { 
     print("repositioning node") 
     node.position = CGPointMake(self.frame.size.width - 100, self.randomCloudPosition()) 
     print(node.position.y) 
     self.moveNode(node) 
    } 

    //move the node again 
    func moveNode(node: SKSpriteNode) { 
     node.runAction(SKAction.moveToX(-100, duration: 28), completion: { 
      self.repositionNode(node) 
     }) 
    } 

    //return a random number between 300 and 799 (change this for your specific case) 
    func randomCloudPosition() -> CGFloat { 
     return CGFloat(arc4random_uniform(500) + 300) //should be between 300 and 799 
    } 
} 

Sie sollten in der Lage Ihre fünf Wolken (oder wie viele) zu erstellen und dann übergeben Sie einfach jeden in moveNode und die Animation wird unendlich fortgesetzt

+0

Vielen Dank für Ihre Antwort! – msqar

+0

Ich bin froh, dass ich helfen konnte! – jsondwyer

+0

ja! es funktionierte wie ein Charme :) – msqar

Verwandte Themen