Question Comment faire la transition des scènes dans Swift


En Objective-C, en utilisant Sprite-Kit, je avec succès utiliser quelque chose comme le code suivant dans Objective-C pour faire apparaître une nouvelle scène

if ([touchedNode.name  isEqual: @"Game Button"]) {
        SKTransition *reveal = [SKTransition revealWithDirection:SKTransitionDirectionDown duration:1.0];
        GameScene *newGameScene = [[GameScene alloc] initWithSize: self.size];
        //  Optionally, insert code to configure the new scene.
        newGameScene.scaleMode = SKSceneScaleModeAspectFill;
        [self.scene.view presentScene: newGameScene transition: reveal];
    }

En essayant de porter mon jeu simple à Swift, j'ai pour l'instant cette ...

for touch: AnyObject in touches {
        let touchedNode = nodeAtPoint(touch.locationInNode(self))
        println("Node touched: " + touchedNode.name);
        let touchedNodeName:String = touchedNode.name

        switch touchedNodeName {
        case "Game Button":
            println("Put code here to launch the game scene")

        default:
            println("No routine established for this")
        }

Mais je ne sais pas quel code écrire pour réellement passer à une autre scène. Des questions):

  1. Quelqu'un peut-il fournir un exemple d'utilisation de SKTransition avec Swift?
  2. Pourriez-vous normalement créer un autre "fichier" pour placer l'autre code de scène pour l'autre scène, en supposant que vous ayez sous Objective-C, ou y a-t-il quelque chose avec Swift qui signifie que je devrais l'approcher différemment?

Je vous remercie


14
2018-06-08 23:30


origine


Réponses:


Pour commencer avec votre deuxième question, cela dépend de vous. Si vous le souhaitez, vous pouvez continuer à suivre la convention Objective-C consistant à avoir une classe par fichier, bien que cela ne soit pas obligatoire et qu'elle ne soit pas non plus dans Objective-C. Cela étant dit, si vous avez deux classes étroitement liées, mais qui ne contiennent pas beaucoup de code, il ne serait pas déraisonnable de les regrouper dans un seul fichier. Il suffit de faire ce qui se sent bien et de ne pas créer un gros tas de code dans un seul fichier.

Ensuite, pour vos premières questions ... Oui, vous en aviez déjà beaucoup. Fondamentalement, à partir de là où vous vous êtes mis en place, vous devez créer l'instance de GameScene à travers sa taille: initializer. De là, vous venez de définir les propriétés et l'appel présent.

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    super.touchesBegan(touches, withEvent: event)

    guard let location = touches.first?.locationInNode(self),
        let scene = scene,
        nodeAtPoint(location) == "Game Button" else {
        return
    }

    let transition = SKTransition.reveal(
        with: .down, 
        duration: 1.0
    )

    let nextScene = GameScene(size: scene.size)
    nextScene.scaleMode = .aspectFill

    scene.view?.presentScene(nextScene, transition: transition)
}

39
2018-06-09 00:40



Si vous devez travailler sur le toucher ou le nœud, utilisez-le:

override func touchesBegan(touches: NSSet!, withEvent event: UIEvent!) {
        let touch = touches.anyObject() as UITouch
        if CGRectContainsPoint(btncloseJump.frame, touch.locationInNode(self)) {
            self.scene.removeFromParent()
            btncloseJump.removeFromParent()
            let skView = self.view as SKView
            skView.ignoresSiblingOrder = true
            var scene: HomeScene!
            scene = HomeScene(size: skView.bounds.size)
            scene.scaleMode = .AspectFill
            skView.presentScene(scene, transition: SKTransition.fadeWithColor(SKColor(red: 25.0/255.0, green: 55.0/255.0, blue: 12.0/255.0, alpha: 1), duration: 1.0))
        }
    }

3
2017-09-05 06:49