Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何访问SpriteKit中其他类中已更改的属性_Swift_Class_Sprite Kit - Fatal编程技术网

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

Swift 如何访问SpriteKit中其他类中已更改的属性,swift,class,sprite-kit,Swift,Class,Sprite Kit,我在一个类中有一个函数(touchesbreated),可以更改属性 class Difficulty: SKScene { var easy: SKSpriteNode? var middle: SKSpriteNode? var hard: SKSpriteNode? var difficultLevel: DifficultLevel? override func didMove(to view: SKView) { self.ea

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

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)
    }
}

它总是打印零。我不明白为什么尽管我在函数
touchesbeated
中更改了类
难度
本身的属性,但你的.difficultLevel为零的原因是你从来没有设置过它。了解如何浏览代码

override func didMove(to view: SKView) {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
func goToGameScene() {
在以下哪一点:

let getDifficultLevel = Difficulty()
print(getDifficultLevel.difficultLevel)
ToucheSBegind函数是否被调用?(提示:永远不会)

现在你很可能会告诉我,“我确实会接到电话”

我们哪里出了问题

让getDifficultLevel=Demobility()
正在创建一个新场景,而不是使用已设置的场景

现在我想,困难实际上是你们的开始场景,你们不知何故正在过渡到游戏场景

在转换过程中,您需要传递这些数据。我建议为此使用
userData

所以当你展示你的游戏场景时,你会想做这样的事情

//self is the Difficulty scene
let gameScene = GameScene(...)
gameScene.userData = ["difficultLevel":self.difficultLevel]
self.view.presentScene(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!!!!")
    }
}

现在我们可以进入上一个场景提供的难度级别。

难度是您在故事板中与引用关联的一个类吗?因为如果它是您的引用,那么游戏场景中的getDifficultLevel=Demobility()是另一个实例。嗨,如果我想使用GameSecene.userData,我会遇到一个错误。此错误:无法将“[Any]”类型的值分配给“NSMutableDictionary”类型。对不起,应该是冒号,而不是逗号
//self is the Difficulty scene
let gameScene = GameScene(...)
gameScene.userData = ["difficultLevel":self.difficultLevel]
self.view.presentScene(gameScene)
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!!!!")
    }
}