如何在Swift中进行场景转换

14
在 Objective-C 中使用 Sprite-Kit,我可以成功地使用类似以下代码的 Objective-C 代码来启动新场景。
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];
    }

尝试将我的简单游戏移植到Swift,目前为止我已经成功了...

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

但我不知道应该写哪段代码才能真正地转换到另一个场景。

问题:
  1. 请问有人能提供一个在Swift中使用SKTransition的例子吗?
  2. 通常情况下,您是否会像在Objective-C中那样创建另一个“文件”将其他场景的代码放在其中,或者使用Swift意味着我应该采用不同的方法来处理它?

谢谢。


1
  1. 实际上,Swift 使得使用多个文件更加容易,因为它会自动导入模块中的所有文件。没有理由不遵循与 Objective-C 相同的模式。
- David Skrundz
2个回答

39

对于你的第二个问题,这取决于你。如果你希望的话,可以继续遵循Objective-C的惯例,即每个文件只包含一个类,尽管这不是必须的,而且在Objective-C中也不是。也就是说,如果你有几个紧密相关但代码量不多的类,将它们分组到同一个文件中也是可以的。只需按照自己的感觉去做,不要在单个文件中编写大量代码。

至于你的第一个问题... 是的,你已经掌握了很多。基本上,从你学到的内容开始,你需要通过其size:初始化程序创建GameScene实例。从那里开始,你只需设置属性并调用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)
}

2
可以了,谢谢。对于像我一样有点困难的人,需要注意的是,“GameScene”在“GameScene(size: self.scene.size)”中只是指您创建的SpriteKit文件名(它不是一个特殊的保留短语)。 - Narwhal
1
你正在进行场景过渡时,原来的场景会发生什么?它会继续运行还是需要暂停它?如果原来的场景上有一些动作正在发生,那么这可能会影响你的游戏。 - zeeple
2
默认情况下,在场景转换期间,出场和入场场景都会被暂停。如果您希望更改此行为,则可以通过更改SKTransition的“pausesIncomingScene”和“pausesOutgoingScene”属性的值来实现。 - Mick MacCallum
1
在你的“转换”中:'Down'已被重命名为'down',而'revealWithDirection(_:duration:)'已被重命名为'reveal(with:duration:)'。在nextScene.scaleMode上,'AspectFill'已被重命名为'aspectFill'。 - Nick

3

如果你需要在触摸开始或节点操作上工作,那么请使用它:

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

这个答案对我也有帮助。 - Nate4436271

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接