如何在SpriteKit中的其他类中访问已更改的属性

时间:2018-07-10 14:03:26

标签: swift class sprite-kit

我在一个类中有一个函数(touchesBegan),可以更改属性。

class Difficulty: SKScene {
    var easy: SKSpriteNode?
    var middle: SKSpriteNode?
    var hard: SKSpriteNode?
    var difficultLevel: DifficultLevel?

    override func didMove(to view: SKView) {
        self.easy = self.childNode(withName: "easy") as? SKSpriteNode
        self.middle = self.childNode(withName: "middle") as? SKSpriteNode
        self.hard = self.childNode(withName: "hard") as? SKSpriteNode

    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
            let location = touch.location(in: self)
            if (easy?.contains(location))! {
                difficultLevel = .easy
                goToGameScene()
            } else if (middle?.contains(location))! {
                difficultLevel = .middle
                goToGameScene()
            } else if (hard?.contains(location))! {
                difficultLevel = .hard
                goToGameScene()
            }
        }
    }

    func goToGameScene() {
        let gameScene = GameScene(size: self.size)
        let crossFade = SKTransition.crossFade(withDuration: 2)
        self.view?.presentScene(gameScene, transition: crossFade)
    }
}

我希望其他类可以访问更改后的difficultLevel属性,但是如果我使用let getDifficultLevel = Difficulty()在其他类中创建对象并执行以下操作:

enum DifficultLevel {
    case easy
    case middle
    case hard
}

class GameScene: SKScene{
    override func didMove(to view: SKView) {
        let getDifficultLevel = Difficulty()
        print(getDifficultLevel.difficultLevel)

        switch getDifficultLevel.difficultLevel {
        case .easy?: spawnTimer = Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(self.createEnemy), userInfo: nil, repeats: true)
        case .middle?: spawnTimer = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(self.createEnemy), userInfo: nil, repeats: true)
        case .hard?: spawnTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(GameScene.createEnemy), userInfo: nil, repeats: true)
        case .none:
            print("nil!!!!")
        }
    }
}

它总是打印nil。我不明白为什么我在函数Difficulty中更改了类touchesBegan本身的属性。

1 个答案:

答案 0 :(得分:1)

.difficultLevel为nil的原因是,您再也不必设置它了。了解如何遍历代码。

override func didMove(to view: SKView) {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
func goToGameScene() {

是您课堂上唯一的函数,并且设置难度的唯一函数是touchesBegan

让我们转到您的GameScene函数:

 override func didMove(to view: SKView) {

    let getDifficultLevel = Difficulty()
    print(getDifficultLevel.difficultLevel)

    switch getDifficultLevel.difficultLevel {
    case .easy?: spawnTimer = Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(self.createEnemy), userInfo: nil, repeats: true)
    case .middle?: spawnTimer = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(self.createEnemy), userInfo: nil, repeats: true)
    case .hard?: spawnTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(GameScene.createEnemy), userInfo: nil, repeats: true)
    case .none:
        print("nil!!!!")
    }
}

介于什么时候:

let getDifficultLevel = Difficulty()
print(getDifficultLevel.difficultLevel)

touchesBegan函数是否被调用? (提示:从不)

现在您很可能会告诉我,“触摸开始确实会被调用”

我们哪里出错了?

let getDifficultLevel = Difficulty()正在创建一个新场景,而不是使用已经场景化的场景。

现在我要猜测难度实际上是您的起始场景,并且您正在以某种方式过渡到GameScene。

那么您将需要在过渡期间传递该数据。我建议为此使用userData

因此,当您展示GameScene时,您将想要做这样的事情。

//self is the Difficulty scene
let gameScene = GameScene(...)
gameScene.userData = ["difficultLevel":self.difficultLevel]
self.view.presentScene(gameScene)

然后在GameScene中,您想将didMove更改为以下内容:

override func didMove(to view: SKView) {

    let difficultLevel = userData!["difficultLevel"] as! DifficultLevel //If the code crashed here, this means we have a path that does not set userData, so we need to address that
    print(difficultLevel)

    switch difficultLevel {
    case .easy?: spawnTimer = Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(self.createEnemy), userInfo: nil, repeats: true)
    case .middle?: spawnTimer = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(self.createEnemy), userInfo: nil, repeats: true)
    case .hard?: spawnTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(GameScene.createEnemy), userInfo: nil, repeats: true)
    case .none:
        print("nil!!!!")
    }
}

现在我们可以访问上一场景提供的难度级别了。