2017-01-25 28 views
0

我想創建背景,有幾個雲從右到左移動,但是當我跑這個時,我只能看到在背景上創建的雲,但他們沒有移動。Spritkit在場景中添加了節點但未移動?

我有下面的類來創建雲,然後將它們添加到場景中。最後一個函數moveBGcloud()將從右向左移動雲。

import Foundation 
import SpriteKit 

import SpriteKit 
class BGCloud :SKSpriteNode{ 

    private func shuffle(cloudsArray: [SKSpriteNode]) -> [SKSpriteNode] { 

     var shuffledArray = cloudsArray; 

     for i in 0..<shuffledArray.count { 
      let j = Int(arc4random_uniform(UInt32(shuffledArray.count - i))) + i; 
      if i == j {continue} 
      swap(&shuffledArray[i], &shuffledArray[j]); 
     } 

     return shuffledArray; 
    } 

    private func randomBetweenNumbers(firstNum: CGFloat, secondNum: CGFloat) -> CGFloat { 
     return CGFloat(arc4random())/CGFloat(UINT32_MAX) * abs(firstNum - secondNum) + min(firstNum, secondNum); 
    } 

    func createClouds() -> [SKSpriteNode] { 
     var clouds = [SKSpriteNode](); 

      let cloud1 = SKSpriteNode(imageNamed: "Cloud 1"); 
      cloud1.name = "BGCloud1"; 
      let cloud2 = SKSpriteNode(imageNamed: "Cloud 2"); 
      cloud2.name = "BGCloud2"; 
      let cloud3 = SKSpriteNode(imageNamed: "Cloud 3"); 
      cloud3.name = "BGCloud3" 
      let darkCloud = SKSpriteNode(imageNamed: "Dark Cloud"); 
      darkCloud.name = "BGDarkCloud"; 

      cloud1.xScale = 0.3; 
      cloud1.yScale = 0.3; 

      cloud2.xScale = 0.4; 
      cloud2.yScale = 0.4; 

      cloud3.xScale = 0.5; 
      cloud3.yScale = 0.5; 

      darkCloud.xScale = 0.2; 
      darkCloud.yScale = 0.2; 


      clouds.append(cloud1); 
      clouds.append(cloud2); 
      clouds.append(cloud3); 
      clouds.append(darkCloud); 

     clouds = shuffle(cloudsArray: clouds); 

     return clouds; 
    } 

    func arrangeBGCloudsInScene(scene: SKScene, minX: CGFloat, maxX: CGFloat,minY: CGFloat, maxY: CGFloat,speed:CGFloat) { 

     var clouds = createClouds(); 

     for i in 0..<clouds.count { 

      var randomX = CGFloat(); 
      var randomY = CGFloat(); 

      randomX = randomBetweenNumbers(firstNum: minX, secondNum: maxX); 
      randomY = randomBetweenNumbers(firstNum: minY, secondNum: maxY); 


      clouds[i].position = CGPoint(x: randomX, y: randomY); 
      clouds[i].zPosition = 2; 


      scene.addChild(clouds[i]); 

     } 

    } 

    func moveBGcloud(speed:CGFloat){ 

     let cloudSpeed = speed 
     self.position.x -= cloudSpeed 

     print("postion",self.position.x) 


     if self.position.x < -324 { 
      self.position.x = 332 

     } 

    } 

} 
在GameplayScene類

然後:(回到地面場景類)

我添加BGCloud類的實例

private var cloud1: BGCloud? 
    private var cloud2: BGCloud? 
    private var cloud3: BGCloud? 
    private var darkCloud:BGCloud? 

    private let BGCloud1Speed = 0.5 
    private let BGCloud2Speed = 0.7 
    private let BGCloud3Speed = 0.8 

然後加入功能BGCloudController.arrangeBGCloudsInScene初始化背景

private func initializeGame() { 

    BGCloudController.arrangeBGCloudsInScene(scene: self.scene!, minX: minX, maxX: maxX, minY: minY, maxY: maxY, speed: CGFloat(BGCloud1Speed)) 
    getBackgrounds(); 

} 

從現場得到雲彩:

private func getBackgrounds() { 

    cloud1 = self.childNode(withName: "BGCloud1") as? BGCloud! 
    cloud2 = self.childNode(withName: "BGCloud2") as? BGCloud! 
    cloud3 = self.childNode(withName: "BGCloud3") as? BGCloud! 

} 

增加的CreateBGClouds功能移動從右背景雲更新功能左

override func update(_ currentTime: TimeInterval) { 

    createBGClouds()  

} 



private func createBGClouds(){  

    cloud1?.moveBGcloud(speed: CGFloat(BGCloud1Speed)) //only add cloud1 for testing  
    print("function called") 

} 

,當我跑的遊戲,我可以看到四個背景的雲彩,隨機在現場,但他們都沒有移動。好像是

BGCloud類中的moveBGcloud()函數未被調用。 Cloud1,2,3無法獲得價值。爲什麼?另外我沒有使用場景編輯器。

你能幫我檢查是什麼問題或我錯過了什麼。先謝謝你。

+0

它看起來像在moveBGcloud方法,你是改變,而不是雲計算的x位置self.position.x,我想你會想要將您的雲作爲參數傳遞給該方法,以便它可以更改雲的x位置。那有意義嗎? –

+0

你是否正在'update(_:currentTime)'中調用你的'moveBGCloud'方法?我認爲這絕對是你想第一步 – Pierce

+0

@MSU_Bulldog不是真的。 'moveBGcloud'是'BGCloud'類的實例方法!!! –

回答

0

正如我們在上面的評論中發現的那樣,雲實例化中存在一種錯字。

改變分配在func createClouds()BGCloud修復該問題:

let cloud1 = BGCloud(imageNamed: "Cloud 1"); 
    cloud1.name = "BGCloud1"; 
    let cloud2 = BGCloud(imageNamed: "Cloud 2"); 
    cloud2.name = "BGCloud2"; 
    let cloud3 = BGCloud(imageNamed: "Cloud 3"); 
    cloud3.name = "BGCloud3"