我在一个类中有一个函数(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
本身的属性。
答案 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!!!!")
}
}
现在我们可以访问上一场景提供的难度级别了。