2017-07-21 5 views
0

J'ai juste commencé à apprendre Swift comme mon premier langage de codage. Mon défi actuel consiste à essayer d'automatiser les transitions à partir d'une configuration de niveau actuelle comme LevelOne.sks vers un autre niveau également créé dans l'éditeur de niveau Xcode sous le nom LevelTwo.sks. Ce que je tente de faire est de déclencher une transition vers le niveau suivant avec l'ensemble de code suivant.Le code suivant fonctionne quand je passe manuellement la valeur mais échoue quand je déballe la valeur

Dans ma scène de base que j'ai cette fonction pour envoyer le joueur au niveau suivant

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

} 

Il est ensuite passé à un fichier 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) 
    } 

Je pense que cela a quelque chose à voir avec comment j'essaie de définir nextLevel. Actuellement, je suis cette mise en place comme suit un peu de chance

let nxtLvl = String? 
nxtLvl = ".levelOne" 
goToNextLevel(nextLevel: nxtLvl) 

vous pouvez comprendre ce que je suis en train de réaliser et que je suis au moins près d'être sur la bonne voie. Toute aide serait grandement appréciée. Merci!

Répondre

0

Ce qui pourrait vraiment vous aider à résoudre:

retourne SceneIdentifier.levelOne.rawValue this -> "LevelOne"

MAIS

SceneIdentifier (rawValue: "LevelOne") renvoie -> SceneIdentifier. levelOne

Vous voyez la différence? Dans le premier, vous obtenez la chaîne, dans ce cas, ce que vous voulez Et dans le second, vous obtenez le « membre gauche » (je ne sais pas le therm)

Un exemple pour y voir plus clair si vous avez un ENUM :

enum SceneIdentifier: String { 
    case case1 = "LevelOne" 
    case case2 = "LevelTwo" 

} 

SceneIdentifier(rawValue : "LevelOne") !

renvoie cette: SceneIdentifier.case1

et SceneIdentifier.case1.rawValue retours ceci: "LEVELONE"

+0

Ne pas inclure des choses comme "(Supprimé ma dernière réponse bc c'était faux)", car cela n'améliore pas la réponse. –

+0

'SceneIdentifier (rawValue:" LevelOne ")! = SceneIdentifier.levelOne' c'est une instruction incorrecte. Ils sont, en fait, égaux. –

+0

Merci Allen le "!" était une faute de frappe je l'ai corrigé – Leo

0

Étant donné que vous initialisez avec une valeur brute, vous devez réellement utiliser la valeur brute.

let nxtLvl = String? 
nxtLvl = "LevelOne" //this is the rawValue of the .levelOne case 
goToNextLevel(nextLevel: nxtLvl) 

Sinon, vous pouvez changer votre API afin que goToNextLevel accepte simplement un SceneIdentifier comme celui-ci.

//tip: use the parameter name as part of the method name 
private func goTo(nextLevel: SceneIdentifier) { 

//Then calling the function 
goTo(nextLevel: .levelOne) 

Cependant, cela pourrait ne pas être approprié dans la plus grande portée de votre API.