2016-02-21 16 views
7

Tôi có một nút để tạm dừng trò chơi trên mã của mình. Điều tôi muốn là tạm dừng trò chơi bằng nút đó làm cho thông báo có nội dung "Tạm dừng" xuất hiện. Tuy nhiên, vì cảnh bị tạm dừng, thông báo không xuất hiện.SpriteKit: chạy hành động trong khi cảnh bị tạm dừng

Điều tôi có ngay bây giờ là SKLabelNode với alpha ở 0.0 lúc bắt đầu và khi người dùng tạm dừng trò chơi, nó thay đổi thành 1.0 với fadeInWithDuration(). Sau đó, khi người dùng nhấn nút một lần nữa, nó thay đổi trở lại 0.0 với fadeOutWithDuration(). Vấn đề là SKAction với fadeInWithDuration() không chạy khi cảnh bị tạm dừng.

Làm cách nào để đạt được điều này?

Trả lời

7

Cách tốt nhất, một Apple cũng sử dụng trong "DemoBots", là tạo ra một nút thế giới mà bạn tạm dừng thay vì cảnh.

Tạo một tài sản worldNode

class GameScene: SKScene { 

    let worldNode = SKNode() 
} 

thêm nó vào cảnh trong didMoveToView

addChild(worldNode) 

và hơn thêm tất cả mọi thứ bạn cần dừng lại để các worldNode. Điều này bao gồm các hành động thường được điều hành bởi cảnh (ví dụ. Timers, địch đẻ trứng vv)

worldNode.addChild(someNode) 
worldNode.run(someSKAction) 

Thần ở tạm dừng của bạn func bạn nói

worldNode.isPaused = true 
physicsWorld.speed = 0 

và sơ yếu lý lịch

worldNode.isPaused = false 
physicsWorld.speed = 1 

Bạn cũng có thể thêm một kiểm tra bổ sung trong chức năng Cập nhật của mình nếu bạn có nội dung ở đó mà bạn muốn bỏ qua khi bị tạm dừng.

override func update(_ currentTime: CFTimeInterval) { 

    guard !worldNode.isPaused else { return } 

    // your code 
} 

Cách này dễ dàng hơn để thêm nhãn bị tạm dừng hoặc giao diện người dùng khác khi trò chơi của bạn bị tạm dừng vì bạn chưa thực sự tạm dừng cảnh.Bạn cũng có thể chạy bất kỳ hành động nào bạn muốn, trừ khi hành động đó được thêm vào worldNode hoặc cho một child của worldNode.

Hope this helps

+0

Bạn đã cứu tôi! tôi đánh giá cao giải pháp này vì nó giải quyết một vấn đề tạm dừng khác tôi đã có! có vẻ như đó là vì tôi đã tạm dừng từ gốc ... nó đã gây ra chậm trễ vật lý khi bỏ tạm dừng .. bây giờ với giải pháp SKNode tất cả mọi thứ hoạt động hoàn hảo! – msqar

1

Vì vậy, bạn muốn tạm dừng trò chơi SAU thực hiện hành động đã hoàn tất.

class GameScene: SKScene { 

    let pauseLabel = SKLabelNode(text: "Paused") 

    override func didMoveToView(view: SKView) { 
     pauseLabel.alpha = 0 
     pauseLabel.position = CGPoint(x: CGRectGetMaxY(self.frame), y: CGRectGetMidY(self.frame)) 
     self.addChild(pauseLabel) 
    } 


    func pause(on: Bool) { 
     switch on { 
     case true: pauseLabel.runAction(SKAction.fadeInWithDuration(1)) { 
      self.paused = true 
     } 
     case false: 
      self.paused = false 
      pauseLabel.runAction(SKAction.fadeOutWithDuration(1)) 
     } 
    } 
} 
2

Một cách giải quyết nhanh chóng sẽ được tạm dừng trò chơi của bạn sau khi SKLabelNode xuất hiện trên màn hình:

let action = SKAction.fadeOutWithDuration(duration) 
runAction(action) { 
    // Pause your game 
} 

Một lựa chọn khác sẽ được trộn UIKit và SpriteKit và thông báo cho ViewController lại rằng nó cần hiển thị nhãn này .

class ViewController: UIViewController { 
    var gameScene: GameScene! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     gameScene = GameScene(...) 
     gameScene.sceneDelegate = self 
    } 
} 

extension ViewController: GameSceneDelegate { 
    func gameWasPaused() { 
     // Show your Label on top of your GameScene 
    } 
} 

protocol GameSceneDelegate: class { 
    func gameWasPaused() 
} 

class GameScene: SKScene { 
    weak var sceneDelegate: GameSceneDelegate? 

    func pauseGame() { 
     // Pause 
     // ... 
     sceneDelegate?.gameWasPaused() 
    } 
} 
2

Thay vì dừng lại hiện trường, bạn có thể lớp một số nút cảnh của bạn như thế này

SKScene 
|--SKNode 1 
| |-- ... <--place all scene contents here 
|--SKNode 2 
| |-- ... <--place all overlay contents here 

Sau đó, khi bạn muốn tạm dừng cuộc chơi, bạn tạm dừng chỉ SKNode 1.

này cho phép nút SKNode 2 để tiếp tục chạy, vì vậy bạn có thể thực hiện những việc như có hoạt ảnh và có nút bỏ tạm dừng cảnh cho bạn mà không cần phải thêm một số đối tượng không phải Sprite Kit vào danh sách kết hợp.

0

tôi sẽ thêm nhãn với

self.addChild(nameOfLabel) 

và sau đó tạm dừng các trò chơi với

self.scene?.paused = true 

này tất cả phải đi ở phần nếu pauseButton được chạm của bạn mã.

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