Spritkit在场景中添加了节点但没有移动?

时间:2017-01-25 14:58:20

标签: ios swift sprite-kit

我想创建背景,几乎没有云从右向左移动。但是当我跑步时,我只能看到在背景上创建的云,但它们没有移动。

我有以下课程来创建云,然后在场景中添加它们。最后一个函数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没有价值。为什么?我也没有使用场景编辑器。

你能帮我检查一下我遇到的问题或错过的任何问题。先感谢您。

1 个答案:

答案 0 :(得分: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"