Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to transition scenes in Swift

In Objective-C, using Sprite-Kit, I would successfully use something like the following code in Objective-C to bring up a new scene

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];
    }

In trying to port my simple game to Swift, so far I have this working...

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")
        }

But I do not know what code to write to actually transition to another scene. Question(s):

  1. Can someone please provide an example of using SKTransition with Swift?
  2. Would you normally create another "file" to put the other scene code in for the other scene, assuming you would have under Objective-C, or is there something about using Swift that means I should approach it differently?

Thank you

like image 658
Narwhal Avatar asked Jun 08 '14 23:06

Narwhal


People also ask

What are scenes in Swift?

A scene contains the windows and view controllers for presenting one instance of your UI. Each scene also has a corresponding UIWindowSceneDelegate object, which you use to coordinate interactions between UIKit and your app. Scenes run concurrently with each other, sharing the same memory and app process space.


1 Answers

To start with your second question, it's kind of up to you. If you wish to, you can continue to follow the Objective-C convention of having one class per file, although this isn't a requirement, and wasn't in Objective-C either. That being said, if you have a couple of classes that are tightly related, but aren't made up of much code, it wouldn't be unreasonable to have them grouped in a single file. Just do what feels right, and don't make a huge blob of code in a single file.

Then for your first questions... Yes, you had a good deal of it already. Basically, from where you got up to, you need to create the instance of GameScene through its size: initializer. From there, you just set the properties and call present.

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)
}
like image 183
Mick MacCallum Avatar answered Sep 21 '22 08:09

Mick MacCallum