如何在Swift中过渡场景

时间:2014-06-08 23:30:28

标签: sprite-kit swift transitions ios8 xcode6

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

但是我不知道要写什么代码来实际转换到另一个场景。 问题(S):

  1. 有人可以提供一个使用Swift的SKTransition的例子吗?
  2. 你通常会创建另一个“文件”来将其他场景代码放入另一个场景中,假设你在Objective-C下,或者是否有关于使用Swift的东西,这意味着我应该以不同的方式处理它?<​​/ li >

    谢谢

2 个答案:

答案 0 :(得分:39)

从第二个问题开始,它取决于你。如果您愿意,您可以继续遵循Objective-C惯例,即每个文件只有一个类,尽管这不是一个要求,也不是Objective-C中的。话虽这么说,如果你有几个紧密相关的类,但不是由很多代码组成,那么将它们分组在一个文件中是不合理的。只做正确的事情,不要在一个文件中制作大量的代码。

那么你的第一个问题......是的,你已经有了很多问题。基本上,从你到达的地方开始,你需要通过它的大小创建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)
}

答案 1 :(得分:3)

如果您必须处理touch-begain或节点动作,请使用它:

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