web-dev-qa-db-ja.com

Swiftでシーンを移行する方法

Objective-Cでは、Sprite-Kitを使用してsuccessfully 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の使用について何かありますか?違う?

ありがとうございました

14
Narwhal

2番目の質問から始めると、それはあなた次第です。これは必須ではなく、Objective-Cにもなかったものですが、必要に応じて、ファイルごとに1つのクラスを持つというObjective-Cの規則に従うこともできます。そうは言っても、密接に関連しているが、多くのコードで構成されていないクラスがいくつかある場合、それらを1つのファイルにグループ化することは不合理ではありません。正しいと思われることを行ってください。単一のファイルに大量のコードを作成しないでください。

それからあなたの最初の質問のために...はい、あなたはすでにそれのかなりの量を持っていました。基本的に、あなたが立ち上がったところから、そのサイズを介して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)
}
39
Mick MacCallum

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