2014-06-08 15 views
14

Trong Objective-C, sử dụng Sprite-Kit, tôi sẽ thành công sử dụng một cái gì đó giống như đoạn mã sau trong Objective-C để đưa ra một cảnh mớiLàm thế nào để chuyển cảnh trong 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]; 
    } 

Trong cố gắng để cổng trò chơi đơn giản của tôi để Swift, cho đến nay tôi có điều này làm việc ...

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

Nhưng tôi không biết mã để viết để thực sự chuyển sang cảnh khác. Câu hỏi:

  1. Ai đó có thể vui lòng cung cấp ví dụ về cách sử dụng SKTransition with Swift? Bạn có thường tạo một "tệp" khác để đặt mã cảnh khác trong cảnh khác, giả sử bạn sẽ có trong Objective-C hay là có điều gì đó về việc sử dụng Swift có nghĩa là tôi nên tiếp cận nó theo cách khác?

Cảm ơn bạn

+1

2. Swift thực sự làm cho nó dễ dàng hơn để sử dụng nhiều file vì nó Automagically nhập khẩu tất cả các file trong module . Không có lý do nào để không làm theo các mẫu giống như với Objective-C –

Trả lời

38

Để bắt đầu với câu hỏi thứ hai của bạn, nó là loại tùy thuộc vào bạn. Nếu bạn muốn, bạn có thể tiếp tục theo quy ước Objective-C có một lớp cho mỗi tệp, mặc dù đây không phải là một yêu cầu, và cũng không có trong Objective-C. Điều đó đang được nói, nếu bạn có một vài lớp có liên quan chặt chẽ, nhưng không được tạo thành từ nhiều mã, sẽ không hợp lý nếu chúng được nhóm lại thành một tệp duy nhất. Chỉ cần làm những gì cảm thấy đúng, và không làm cho một blob mã lớn trong một tập tin duy nhất.

Sau đó, cho câu hỏi đầu tiên của bạn ... Có, bạn đã có rất nhiều điều đó rồi. Về cơ bản, từ nơi bạn đã lên đến, bạn cần phải tạo ra thể hiện của GameScene thông qua kích thước của nó: initializer. Từ đó, bạn chỉ cần thiết lập các thuộc tính và gọi hiện tại.

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

Điều đó có hiệu quả. Cảm ơn bạn. Chỉ cần một lưu ý cho những người gần như là thách thức như tôi ... "GameScene" trong "GameScene (kích thước: self.scene.size)" chỉ đề cập đến tên tập tin SpriteKit bạn tạo ra (nó không phải là một cụm từ dành riêng đặc biệt) . – Narwhal

+1

Điều gì xảy ra với cảnh bạn đang chuyển đổi? Nó sẽ tiếp tục chạy hay bạn cần phải cố ý tạm dừng nó? Nếu có một số hành động xảy ra trên hiện trường mà bạn đang chuyển đổi khỏi nó có vẻ như có thể ảnh hưởng đến trò chơi của bạn. – zeeple

+2

@ user1639164 Theo mặc định cả cảnh đi và cảnh đến đều bị tạm dừng trong khi chuyển đổi. Nếu bạn muốn thay đổi hành vi này, nó có thể được thực hiện bằng cách thay đổi các giá trị của thuộc tính 'pauseesIncomingScene' và' pausesOutgoingScene' của SKTransition. –

3

nếu bạn phải làm việc trên touch-begain hoặc hành động nút, sau đó sử dụng nó:

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

câu trả lời này đã giúp tôi. – Nate4436271

Các vấn đề liên quan