2014-06-08 12 views
14

w Objective-C, przy użyciu Sprite-Kit, chciałbym powodzeniem wykorzystanie coś następujący kod w Objective-C, aby otworzyć nową scenęJak przejście scen 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]; 
    } 

Próbując Port moja prosta gra Swift, jak dotąd mam tej pracy ...

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

Ale nie wiem co napisać kod faktycznie przejście do innej sceny. Pytanie (s):

  1. Czy ktoś może podać przykład zastosowania SKTransition z Swift?
  2. Czy normalnie utworzysz kolejny "plik", aby umieścić drugi kod sceny dla drugiej sceny, zakładając, że masz w ramach Celu C, czy jest coś w używaniu Swift, co oznacza, że ​​powinienem podejść do tego inaczej?

Dziękuję

+1

2. Swift rzeczywiście ułatwia korzystanie z wielu plików, ponieważ automagicznie importuje wszystkie pliki w module . Nie ma żadnego powodu, aby nie stosować tych samych wzorców co w Objective-C –

Odpowiedz

38

Na początek drugiego pytania, to trochę do Ciebie. Jeśli chcesz, możesz nadal postępować zgodnie z konwencją Objective-C dotyczącą posiadania jednej klasy dla każdego pliku, chociaż nie jest to wymagane i nie było również w Objective-C. Biorąc to pod uwagę, jeśli masz kilka klas, które są ściśle powiązane, ale nie składają się z dużej ilości kodu, nie byłoby nierozsądne, gdyby zostały zgrupowane w jednym pliku. Po prostu rób to, co jest właściwe, i nie rób wielkich plam kodu w jednym pliku.

Następnie za pierwsze pytania ... Tak, już sporo z tego było. Zasadniczo, skąd wziąłeś udział, musisz utworzyć instancję GameScene przez jej rozmiar: inicjator. Stamtąd wystarczy ustawić właściwości i wywołać prezent.

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

To zadziałało. Dziękuję Ci. Tylko uwaga dla osób, które są prawie tak samo trudne jak ja ... "GameScene" w "GameScene (size: self.scene.size)" odnosi się tylko do utworzonej przez Ciebie nazwy pliku SpriteKit (nie jest to specjalna zarezerwowana fraza) . – Narwhal

+1

Co dzieje się ze sceną, z której przechodzisz? Czy nadal działa lub czy musisz go celowo zatrzymać? Jeśli na scenie wydarzy się jakaś akcja, która odsuwa się od niej, wydaje się, że może to wpłynąć na twoją grę. – zeeple

+2

@ user1639164 Domyślnie zarówno sceny wychodzące, jak i przychodzące są wstrzymywane podczas przejścia. Jeśli chcesz zmienić to zachowanie, można to zrobić, zmieniając wartości właściwości 'pausesIncomingScene' i' pausesOutgoingScene'. –

3

jeśli trzeba pracować na dotykowym begain lub działania węzła, a następnie użyć go:

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

ta odpowiedź pomogła mi również. – Nate4436271