2014-06-08 9 views
14

In Objective-C, utilizzando Sprite-Kit, vorrei successo uso qualcosa di simile al seguente codice in Objective-C per aprire una nuova scenaCome transizione scene a Swift

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

Nel tentativo di porto il mio semplice gioco di Swift, finora ho questo lavoro ...

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

Ma io non so cosa il codice per scrivere effettivamente passare a un'altra scena. Question (s):

  1. Qualcuno può fornire un esempio di utilizzo di SKTransition con Swift?
  2. Creeresti normalmente un altro "file" per inserire l'altro codice di scena per l'altra scena, supponendo che tu avresti sotto Objective-C, o c'è qualcosa nell'usare Swift che significa che dovrei avvicinarmi in modo diverso?

Grazie

+1

2. Swift rende di fatto più facile da usare file multipli in quanto importa automagicamente tutti i file nel modulo . Non c'è alcun motivo per non seguire gli stessi schemi di Objective-C –

risposta

38

di iniziare con la seconda domanda, è una specie di fino a voi. Se lo desideri, puoi continuare a seguire la convenzione Objective-C di avere una classe per file, sebbene questo non sia un requisito, e nemmeno in Objective-C. Detto questo, se hai un paio di classi strettamente correlate, ma non sono costituite da molto codice, non sarebbe irragionevole raggrupparle in un singolo file. Fai solo ciò che sembra giusto e non creare un enorme numero di codice in un singolo file.

Quindi per le prime domande ... Sì, ne avevi già un bel po '. In sostanza, da dove ci si è alzati, è necessario creare l'istanza di GameScene attraverso le sue dimensioni: inizializzatore. Da lì, basta impostare le proprietà e chiamare il presente.

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

che ha funzionato. Grazie. Solo una nota per le persone che sono quasi sfidate come me ... il "GameScene" in "GameScene (size: self.scene.size)" si riferisce solo al nome del file SpriteKit che hai creato (non è una frase riservata speciale) . – Narwhal

+1

Cosa succede alla scena da cui stai effettuando la transizione? Continuerà a funzionare o hai bisogno di fermarlo deliberatamente? Se c'è qualche azione che si sta verificando sulla scena che stai spostando da esso sembrerebbe che potrebbe influenzare il tuo gioco. – zeeple

+2

@ user1639164 Per impostazione predefinita, sia le scene in uscita che quelle in entrata vengono messe in pausa durante la transizione. Se desideri modificare questo comportamento, può essere fatto cambiando i valori delle proprietà 'pausesIncomingScene' e' pauseStudiScene' di SKTransition. –

3

se si deve lavorare su touch-begain o l'azione nodo, quindi usarlo:

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

questa risposta mi ha aiutato pure. – Nate4436271