Swift 如何访问SpriteKit中其他类中已更改的属性
我在一个类中有一个函数(touchesbreated),可以更改属性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
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!!!!")
}
}