spritekit - swift tutorial



Erreur en revenant à une vue précédente dans swift 3 Spritkit (1)

Quand je passe à ma page de jeu de ma scène de menu, cela fonctionne parfaitement bien. Mais quand j'essaie de revenir, c'est un désastre. Je me suis: trouvé de manière inattendue nil tout en déballant une valeur optionnelle. Le code pour revenir est:

        let menuscene = MenuScene(size: self.size)
        menuscene.scaleMode = scaleMode
        self.view?.presentScene(menuscene)

Le code indiquant que l'erreur provient de:

    PlaygamebtnNode = self.childNode(withName: "PlaygamebtnNode") as! SKSpriteNode
    NamelblNode = self.childNode(withName: "NamelblNode") as! SKLabelNode

C'est étrange parce que quand le jeu se lance, c'est bien avec ce code. L'erreur doit provenir du changement de vues / scènes. Merci d'avance pour l'aide. Le code de la classe Entrys MenuScene est:

    import SpriteKit
    import GameplayKit

 class MenuScene: SKScene {


var PlaygamebtnNode:SKSpriteNode!
var NamelblNode:SKLabelNode!

override func didMove(to view: SKView) {

    PlaygamebtnNode = self.childNode(withName: "PlaygamebtnNode") as! SKSpriteNode
    NamelblNode = self.childNode(withName: "NamelblNode") as! SKLabelNode


    PlaygamebtnNode.texture = SKTexture(imageNamed: "Playgamebtn")
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    let touch = touches.first

    if let location = touch?.location(in: self){
        let nodesArray = self.nodes(at: location)

        if nodesArray.first?.name == "PlaygamebtnNode" {
            let transition = SKTransition.flipHorizontal(withDuration: 0.5)

            let nextScene = GameScene(size: self.size)
            self.view?.presentScene(nextScene, transition: transition)
        }
    }

}

La raison pour laquelle il ne s'agit pas d'une valeur nulle ordinaire lors du déballage d'une question de valeur facultative est que cette erreur ne s'affiche pas avant que j'essaie de revenir au menu.


Le problème a commencé avec cette ligne:

PlaygamebtnNode = self.childNode(withName: "PlaygamebtnNode") as! SKSpriteNode 

parce que comme je l'ai dit, self.childNode(withName:) retournait nil

Le vrai problème était cependant lié à cette ligne (à l'intérieur de leavegamefunc() ):

let menuscene = MenuScene(size: self.size)

Vous avez défini votre PlaygamebtnNode dans MenuScene.sks et vous utilisez un mauvais initialiseur ( MenuScene.init(size:) ).

La solution:

 func leavegamefunc() {
        if let menuScene = MenuScene(fileNamed: "MenuScene"){
            menuScene.scaleMode = scaleMode
            self.view?.presentScene(menuScene)
        }
    }




skscene