Следующий код работает, когда я передаю значение вручную, но не получается, когда я разворачиваю значение
Я только начал изучать Swift как мой первый язык программирования. Моя текущая задача - попытаться автоматизировать переходы от текущего уровня настройки как LevelOne.sks к другому уровню, также созданному в редакторе уровней Xcode как LevelTwo.sks. То, что я пытаюсь сделать, это вызвать переход на следующий уровень со следующим набором кода.
В моей базовой сцене у меня есть эта функция, чтобы отправить игрока на следующий уровень
private func goToNextLevel(nextLevel: String) {
//When hard coding the arguments as...
//loadScene(withIdentifier: .levelTwo)
//The level two scene loads and is playable...however,
//When trying to change the level argument in code
// by passing a nextLevel variable
// the optional unwraps nil and crashes the app.
loadScene(withIdentifier: SceneIdentifier(rawValue: nextLevel)!)
}
Затем он передается в файл SceneLoadManager
enum SceneIdentifier: String {
case levelOne = "LevelOne"
case levelTwo = "LevelTwo"
// case levelThree = "LevelThree"
}
private let sceneSize = CGSize(width: 768, height: 1024)
protocol SceneManager { }
extension SceneManager where Self: SKScene {
func loadScene(withIdentifier identifier: SceneIdentifier) {
let reveal = SKTransition.flipHorizontal(withDuration: 0.5)
let nextLevel = SKScene(fileNamed: identifier.rawValue)
nextLevel?.scaleMode = .aspectFill
self.view?.presentScene(nextLevel!, transition: reveal)
}
Я думаю, что это как-то связано с тем, как я пытаюсь установить nextLevel. В настоящее время я настраиваю это следующим образом
let nxtLvl = String?
nxtLvl = ".levelOne"
goToNextLevel(nextLevel: nxtLvl)
Надеюсь, вы сможете понять, чего я пытаюсь достичь, и что я, по крайней мере, близок к тому, чтобы оказаться на правильном пути. Любая помощь будет принята с благодарностью. Спасибо!
2 ответа
Что действительно может помочь вам решить:
SceneIdentifier.levelOne.rawValue возвращает это -> "LevelOne"
НО
SceneIdentifier(rawValue: "LevelOne") возвращает -> SceneIdentifier.levelOne
Увидеть разницу? В первом вы получаете строку, в этом случае, что вы хотите, а во втором вы получаете "левый член" (я не знаю, терм)
Пример, чтобы увидеть яснее, если у вас есть enum:
enum SceneIdentifier: String {
case case1 = "LevelOne"
case case2 = "LevelTwo"
}
SceneIdentifier(rawValue : "LevelOne") !
возвращает это: SceneIdentifier.case1
а также SceneIdentifier.case1.rawValue
возвращает это: "levelOne"
Так как вы инициализируете с необработанным значением, вам нужно фактически использовать необработанное значение.
let nxtLvl = String?
nxtLvl = "LevelOne" //this is the rawValue of the .levelOne case
goToNextLevel(nextLevel: nxtLvl)
Кроме того, вы можете изменить свой API, чтобы goToNextLevel
просто принимает SceneIdentifier
как это.
//tip: use the parameter name as part of the method name
private func goTo(nextLevel: SceneIdentifier) {
//Then calling the function
goTo(nextLevel: .levelOne)
Однако это может не подходить для более широкой области применения вашего API.