Как переходить сцены в Swift

В 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. Может кто-нибудь привести пример использования SKTransition со Swift?
  2. Вы бы обычно создавали еще один «файл», чтобы поместить другой код сцены для другой сцены, предполагая, что у вас будет под Objective-C, или есть что-то в использовании Swift, что означает, что я должен подходить к нему по-другому?

Спасибо


person Narwhal    schedule 08.06.2014    source источник
comment
2. Swift на самом деле упрощает использование нескольких файлов, поскольку он автоматически импортирует все файлы в модуль. Нет никаких причин не следовать тем же шаблонам, что и с Objective-C.   -  person David Skrundz    schedule 09.06.2014


Ответы (2)


Начнем со второго вопроса, это зависит от вас. Если вы хотите, вы можете продолжать следовать соглашению Objective-C о наличии одного класса на файл, хотя это не является обязательным требованием и не было в Objective-C. При этом, если у вас есть пара тесно связанных классов, но не состоящих из большого количества кода, было бы разумно сгруппировать их в один файл. Просто делайте то, что считаете правильным, и не создавайте огромный кусок кода в одном файле.

Тогда для ваших первых вопросов... Да, вы уже наелись. По сути, откуда вы взялись, вам нужно создать экземпляр GameScene через его размер: инициализатор. Оттуда вы просто устанавливаете свойства и вызываете настоящее.

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)
}
person Mick MacCallum    schedule 09.06.2014
comment
Это сработало. Спасибо. Просто примечание для людей, которым почти так же сложно, как и мне... GameScene в GameScene(size: self.scene.size) просто относится к имени файла SpriteKit, который вы создали (это не специальная зарезервированная фраза). - person Narwhal; 09.06.2014
comment
Что происходит со сценой, от которой вы уходите? Будет ли он продолжать работать или вам нужно намеренно приостановить его? Если на сцене происходит какое-то действие, от которого вы уходите, может показаться, что это может повлиять на вашу игру. - person zeeple; 22.08.2014
comment
@user1639164 user1639164 По умолчанию как исходящая, так и входящая сцены приостанавливаются во время перехода. Если вы хотите изменить это поведение, это можно сделать, изменив значения свойств SKTransition pausesIncomingScene и pausesOutgoingScene. - person Mick MacCallum; 22.08.2014
comment
При переходе: 'Down' has been renamed to 'down' и 'revealWithDirection(_:duration:)' has been renamed to 'reveal(with:duration:)'. В nextScene.scaleMode 'AspectFill' has been renamed to 'aspectFill' - person Nick; 28.11.2017

если вам нужно работать с touch-begain или node action , используйте его:

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))
        }
    }
person Community    schedule 05.09.2014
comment
этот ответ помог мне. - person Nate4436271; 16.01.2015