2014-06-08 30 views
14
Objective-C ise

, sahneleri Nasıl geçiş, ben Objective-C aşağıdaki kodu gibi başarıyla kullanım şey çalışırken yeni bir sahneSprite-Kit'i kullanarak 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]; 
    } 

getirmek için olur Swift benim basit bir oyun portu, şimdiye kadar bu çalışma ...

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

var Ama aslında başka olay yerine geçiş için ne yazacağımı kod bilmiyorum. Soru (lar):

  1. Birisi, SWTransition with Swift kullanarak bir örnek verebilir mi?
  2. normalde Objective-C altında olurdu varsayarak, diğer sahne için de diğer sahne kodu koymak için başka bir "dosya" oluşturmak istiyorsunuz, yoksa ben farklı yaklaşım gerektiği anlamına gelir Swift kullanmayla ilgili bir şey mi?

bunun size kalmış sayılır, sizce

+1

2. Swift aslında automagicallylar modülünde tüm dosyaları ithal beri daha kolay birden fazla dosya kullanmak yapar . Çalışılan Objective-C –

cevap

38

ikinci soruyla başlamak için teşekkür ederiz. İsterseniz, bu bir gereklilik olmamasına rağmen Objective-C kuralını dosya başına bir sınıfa sahip olmaya devam edebilir ve Objective-C'de de bulunamazsınız. Şöyle söyleniyor ki, birbiriyle sıkı bir şekilde bağlantılı olan ancak çok fazla kod içermeyen bir kaç sınıfınız varsa, bunların tek bir dosyada gruplandırılması mantıksız olmaz. Sadece doğru olanı yapın ve tek bir dosyada çok büyük bir kod bloğu yapmayın.

Sonra ilk soru için ... Evet, zaten iyi bir anlaşma vardı. Temel olarak, nereden geldiğinize göre, boyutuna göre GameScene örneğini oluşturmanız gerekir: başlatıcı. Oradan, sadece özellikleri ayarlayın ve mevcut arayın. Eğer dokunmatik begain veya düğüm eylem üzerinde çalışmak zorunda

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

ile aynı modelleri izlememenin herhangi bir nedeni yoktur. Teşekkür ederim. Benim kadar meydan neredeyse insanlar için sadece bir not ... lütfen "GameScene" "GameScene (boyut: self.scene.size)" sadece (o ayrılmış özel bir ifade değildir) Oluşturduğunuz SpriteKit dosya adına atıfta . – Narwhal

+1

Geçiş yaptığınız sahneye ne oluyor? Çalışmaya devam edecek mi yoksa kasıtlı olarak duraklatmanız mı gerekiyor? Eğer sahneden geçmekte olduğunuz bir eylem varsa, oyununuzu etkileyebilecek gibi görünüyor. – zeeple

+2

@ user1639164 Varsayılan olarak, hem gelen hem de gelen sahneler geçiş sırasında duraklatılır. Bu davranışı değiştirmek isterseniz, SKTransition'ın pausesIncomingScene ve pausesOutgoingScene özelliklerinin değerlerini değiştirerek yapılabilir. senin "geçiş" Açık –

3

, Sonra kullanmak:

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

bu yanıt bana da yardımcı oldu. – Nate4436271