2014-06-08 1 views
14

En Objective-C, en utilisant Sprite-Kit, je serais avec succès utiliser quelque chose comme le code suivant dans Objective-C pour faire apparaître une nouvelle scèneComment la transition des scènes à 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]; 
    } 

En essayant de Port mon jeu simple à Swift, jusqu'à présent, j'ai ce travail ...

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

Mais je ne sais pas ce code pour écrire à fait la transition vers une autre scène. Question (s):

  1. Quelqu'un peut-il donner un exemple d'utilisation de SKTransition avec Swift? Normalement, créez-vous un autre fichier pour placer l'autre code de scène dans l'autre scène, en supposant que vous ayez sous Objective-C, ou est-ce qu'il y a quelque chose à propos de l'utilisation de Swift?

Merci

+1

2. Swift rend réellement plus facile à utiliser plusieurs fichiers, car il importe automagiquement tous les fichiers dans le module . Il n'y a aucune raison de ne pas suivre les mêmes tendances qu'avec Objective-C –

Répondre

38

Pour commencer votre deuxième question, il est un peu à vous. Si vous le souhaitez, vous pouvez continuer à suivre la convention Objective-C d'avoir une classe par fichier, bien que ce ne soit pas une exigence et qu'elle ne soit pas non plus en Objective-C. Cela étant dit, si vous avez quelques classes qui sont étroitement liées, mais ne sont pas composées de beaucoup de code, il ne serait pas déraisonnable de les regrouper dans un seul fichier. Faites juste ce qui vous semble juste, et ne faites pas une énorme quantité de code dans un seul fichier.

Alors pour vos premières questions ... Oui, vous en avez déjà eu une bonne partie. Fondamentalement, d'où vous vous êtes levé, vous devez créer l'instance de GameScene à travers sa taille: initialisateur. De là, vous venez de définir les propriétés et appelez présent.

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

Cela a fonctionné. Je vous remercie. Juste une note pour les gens qui sont presque aussi défiés que moi ... le "GameScene" dans "GameScene (size: self.scene.size)" se réfère simplement au nom du fichier SpriteKit que vous avez créé (ce n'est pas une phrase réservée spéciale) . – Narwhal

+1

Qu'arrive-t-il à la scène dont vous êtes en train de faire la transition? Continuera-t-il à fonctionner ou avez-vous besoin de faire une pause délibérée? S'il se passe quelque chose sur la scène que vous êtes en train de quitter, cela pourrait affecter votre jeu. – zeeple

+2

@ user1639164 Par défaut, les scènes sortante et entrante sont mises en pause pendant la transition. Si vous souhaitez modifier ce comportement, vous pouvez le faire en modifiant les valeurs des propriétés 'pausesIncomingScene' et' pausesOutgoingScene' de SKTransition. –

3

si vous devez travailler tactile begain ou une action de nœud, utilisez-le:

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

cette réponse m'a aidé aussi. – Nate4436271

Questions connexes