2017-04-02 25 views
7

Tôi đang tạo trò chơi trong Xcode 8 bằng SpriteKit và đã có một khoảng thời gian rất khó lập trình kích hoạt phân đoạn. Tôi đã đi vào "Main.storyboard" và thực hiện một segue giữa "GameViewController" của tôi và "MenuViewController" cho nó định danh "toMenu".Không thể lập trình kích hoạt segue trong SpriteKit, bằng cách sử dụng Xcode 8 và Swift 3

Không Cố gắng # 1

Trong tập tin GameScene.swift của tôi, tôi đã thêm đoạn mã sau vào chức năng cập nhật.

override func update(_ currentTime: TimeInterval) { 
    // Called before each frame is rendered 

    if gameIsRunning == false{ 
     score = 0 
     performSegue(withIdentifier: "toMenu", sender: self) 
    } 
    } 

Mục tiêu của tôi là để segue kích hoạt bất cứ khi nào gameIsRunning sai. Tuy nhiên, tôi nhận được lỗi sau:

Use of unresolved identifier 'performSegue' 

Điều này là lạ bởi vì performSegue là khai báo theo API Reference.

Không Cố gắng # 2

tôi đã cố gắng this solution bằng cách đặt đoạn mã sau vào "GameScene.swift"

override func update(_ currentTime: TimeInterval) { 
    // Called before each frame is rendered 

    if gameIsRunning == false{ 
     score = 0 
     GameScene(MenuViewController, animated: true, completion: nil) 
    } 

và tôi đã nhận lỗi này:

Type of expression is ambiguous without more context 

Không Cố gắng # 3

Tôi thấy this solution rất khó hiểu nhưng tôi theo dõi mọi thứ. Tôi đã thực hiện bước 1, như đã nêu trong bước 2, tôi đặt mã sau vào cuối "GameViewController.swift"

func goToDifferentView() { 

self.performSegue(withIdentifier: "toMenu", sender: self) 

} 

và không gặp lỗi! Sau đó, tôi thêm mã này để "GameViewController.swift" theo hướng dẫn ở bước 3 của giải pháp

override func viewDidLoad() { 
    super.viewDidLoad() 

    NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: NSNotification.Name(rawValue: "toMenu"), object: nil) 

Sau đó, tôi đã bước 4 của giải pháp vì vậy tôi đặt đoạn mã sau vào "MenuViewController.swift"

override func viewDidLoad() { 
    super.viewDidLoad() 

    NotificationCenter.default.post(NSNotification(name: NSNotification.Name(rawValue: "toMenu"), object: nil) as Notification) 

Tôi sau đó đặt đoạn mã sau vào tệp "GameScene.swift" của tôi để thực sự gọi hàm.

override func update(_ currentTime: TimeInterval) { 
    // Called before each frame is rendered 

    if gameIsRunning == false{ 
     score = 0 
     GameViewController().goToDifferentView() 
    } 

Sau đó, tôi chạy trò chơi trên iPhone của mình và mọi thứ diễn ra tốt đẹp cho đến khi tôi tham gia trò chơi mà gameIsRunning chuyển thành false. Thay vì segue làm việc của nó, tôi đã nhận lỗi sau:

Thread 1: Signal SIGABRT 

Tôi đã nhận lỗi này nhiều lần và nó luôn luôn là một cái gì đó mà tôi có nối không đúng cách trong "Main.storyboard". Tuy nhiên, đây là một trò chơi cực kỳ đơn giản và mọi thứ đều bình thường. Tôi cũng không nhận được lỗi này cho đến khi thêm mã mà tôi vừa mới trình bày cho bạn. Tôi đã xác nhận nhiều lần rằng segue có định danh "toMenu". Tôi hoàn toàn không biết tại sao segue không hoạt động và tại sao Attemp # 3 của tôi lại gây ra lỗi SIGABRT.

+0

Loại segue nào? – GlennRay

+0

@GlennRay Loại này là 'Hiển thị (ví dụ: Đẩy)' và đó là 'Phân đoạn bảng phân cảnh'. Tôi không chắc chắn làm thế nào để có được bất kỳ chi tiết bổ sung về nó. – chas

+1

Câu hỏi đầu tiên tuyệt vời. Mẹo: nếu bạn muốn sử dụng chữ in đậm, hãy sử dụng dấu sao đôi ở bên cạnh một đoạn văn bản, việc nhập lại dễ dàng hơn và dễ dàng chỉnh sửa hơn HTML. Nếu bạn muốn định dạng một đoạn mã nội tuyến trong một đoạn văn, 'sử dụng một dấu gạch chéo ngược 'hai bên. – halfer

Trả lời

2

Vì bạn đang cố gắng kích hoạt phân đoạn này trong hàm update(), nó được gọi nhiều lần mỗi giây.Hãy thử đoạn mã sau và nó sẽ hoạt động.

override func update(_ currentTime: TimeInterval) { 
// Called before each frame is rendered 

if gameIsRunning == false{ 
    score = 0 
    gameIsRunning = true 
    NotificationCenter.default.post(NSNotification(name: NSNotification.Name(rawValue: "toMenu"), object: nil) as Notification) 
} 

Nếu bạn đặt print("update") trong tuyên bố if bạn sẽ thấy ý tôi. Đặt số gameIsRunning bool thành true bên trong nếu bạn đảm bảo nó chỉ được gọi một lần.

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