2014-05-07 18 views
8

Điều này có vẻ như một khái niệm cơ bản như vậy nhưng thực sự không có câu trả lời tốt.Làm thế nào để tạm dừng hiệu quả một trò chơi trong spritekit?

Tôi hiện có thiết lập khá cơ bản, trong cảnh trò chơi của mình, tôi có một số enum gameState hiện tại là inGame hoặc gamePaused.

Tôi đã thiết lập nút của mình và tôi có nó để nhấn chỉ cần bật tắt gameState.

Sau đó, để làm cho nó hoạt động, tôi có hai phương pháp cập nhật riêng biệt: Một cho khi gamePaused, một cho khi inGame.

Điều này làm việc cho 95% trò chơi của tôi, vì các bản cập nhật trong trò chơi của tôi có thể dễ dàng bắt đầu và dừng mà không gặp bất kỳ sự cố nào. Có một số vấn đề tôi không thể giải quyết được.

Đầu tiên và quan trọng nhất là các hành động. Tôi sử dụng SKActions cho một chút dự án của tôi (một số chuyển động, mở rộng, mờ dần ...) và phương pháp này KHÔNG tạm dừng chúng. Điều này có thể thảm khốc ở một số điểm nhất định. Thứ hai, điều này không xử lý các hạt, vật lý và một số thứ khác không liên quan trực tiếp đến các phương thức cập nhật của tôi.

Đầu mối duy nhất tôi có là self.view.paused = YES, nhưng điều đó cũng không hoạt động.

Trước hết, điều này sẽ khắc phục hành động, hạt và vấn đề vật lý của tôi ... kinda. Nhưng This question cho thấy rằng SKActions không thực sự BỊ TẠO bởi điều này, nhưng thực sự STOPPED hoàn toàn. Điều này có đúng không? Nếu có, thì nó sẽ không hoạt động trơn tru, bởi vì các hành động của tôi bị vứt bỏ.

Ngoài ra, tạm dừng chế độ xem có vẻ như làm những gì nó nói: dừng mọi thứ. MỌI ĐIỀU. Newbie câu hỏi ở đây, nhưng làm thế nào tôi có thể nhận được bất kỳ mã để chạy vào thời điểm đó? Tất cả đều bị cắt. Đây có phải là nơi tôi cần subViews không? Tôi chưa bao giờ sử dụng subView, nhưng nó có vẻ giống như những gì tôi muốn trong trường hợp này.

Nói một cách đơn giản, có rất nhiều câu hỏi chưa được trả lời cho tôi và tôi không biết cách tiếp tục. Tôi hy vọng có một số 'thủ tục tiêu chuẩn' để tạm dừng trong Sprite Kit, nhưng với tạm dừng các hành động dừng xem, tôi thực sự không biết phải tiến hành ở đâu.

Tôi có nên chuyển từ việc sử dụng các hành động không? Ý tưởng của tôi về âm thanh tạm dừng subView?

Tôi không muốn lảm nhảm, tất cả những gì tôi muốn biết là cách bạn tạm dừng trong dự án trung bình Sprite Kit của bạn. Thông tin bổ sung được cung cấp theo yêu cầu.

+1

1. Thử đặt tốc độ tác vụ thành 0.0. 2. Thử thiết lập cảnh bị tạm dừng thành CÓ. 3. Thử đặt self.view.paused thành YES 4. Thử kết hợp cả ba. – AndrewShmig

Trả lời

13

Tạm dừng nút sẽ tạm dừng (không dừng) hành động của nút và giả sử tạm dừng cũng sẽ được áp dụng cho tất cả trẻ em của nút bị tạm dừng theo cùng một cách. Tất cả các nút được bỏ tạm dừng khác sẽ tiếp tục chạy các hành động của họ để hoàn thành.

Bạn phải có nút "lớp trò chơi" với tất cả các nút trò chơi trong đó mà bạn muốn tạm dừng và sau đó chỉ cần tạm dừng nút "lớp trò chơi" đó. Sau đó, có một nút "tạm dừng menu" nút, nơi bạn thêm tất cả các công cụ trình đơn tạm dừng bạn cần mà sẽ tiếp tục hoạt động bình thường ngay cả khi các lớp trò chơi bị tạm dừng. Hãy chắc chắn rằng bạn không sử dụng performSelector hoặc NSTimer hoặc GCD hoặc bất kỳ phương pháp lập lịch nào khác ngoài hành động hoặc cập nhật của cảnh: phương pháp vì những phương pháp đó sẽ không tuân thủ trạng thái tạm dừng của nút.

Tạm dừng chế độ xem có hiệu quả đóng băng mọi thứ trong đó, tạm dừng cảnh theo một số sẽ không tạm dừng cập nhật: cuộc gọi - nhưng tôi chưa tự xác minh điều này. Nếu trường hợp này xảy ra, bạn luôn có thể kiểm tra bên trong phương thức cập nhật xem liệu một nút cụ thể mà bạn gửi một tin nhắn có bị tạm dừng hay không và nếu không, hãy quyết định không gửi một số thông điệp đến nút đó.

+0

Điều này dường như làm việc tốt nhất, không thể tin rằng tôi bị mất nó mặc dù ... Tạm dừng các nút không ngừng hành động, và bằng cách tạm dừng lớp trò chơi của tôi nền tảng của nút tạm dừng của tôi được hoàn thành. Tôi đã không nhận ra các nút riêng lẻ có thể được tạm dừng, và làm như vậy ảnh hưởng đến trẻ em cũng ... cảm ơn. Bằng cách này, tất cả các lời khuyên khác trong chủ đề này cũng hữu ích :) – IAmTheAg

+0

Đây là điều tốt nhất! Đầu tôi đau một chút vì nó liên tục bị đập trên tường trước khi đọc câu trả lời của bạn :) Cảm ơn một bó – Septronic

1

tôi có thể cho bạn biết những gì tôi đã làm trong tôi trò chơi:

  1. Tạm dừng SKView trên -applicationWillResignActive: (hoặc tương đương, sử dụng NSNotification s),

  2. Un-tạm dừng SKView trên -applicationDidBecomeActive: (hoặc tương đương, sử dụng NSNotification s),

Chỉ với cảnh trò chơi thực tế, tôi đặt cờ boolean _isPaused khi từ chức đang hoạt động và nếu đúng, tôi chỉ cần bỏ qua phương thức -update: (cập nhật khung). (Tôi cũng hiển thị menu "bị tạm dừng" khi người dùng tiếp tục ứng dụng).

... Nhưng trò chơi của tôi là một trò chơi giải đố đơn giản và không có hành động dài nào nên tiếp tục quá trình tạm dừng/tiếp tục. Tôi không thể xác nhận ngay bây giờ rằng tất cả các hành động đều bị hủy bỏ, nhưng tôi nghĩ rằng đó là không phải là trường hợp.

+1

Cảm ơn bạn đã phản ứng nhanh, tôi cần phải ngủ ngay bây giờ nhưng tôi chắc chắn sẽ xem xét điều này. Tôi cũng sẽ kiểm tra các hành động hủy bỏ câu hỏi, mà tôi không thể tìm hiểu làm thế nào để làm bởi vì mã của tôi đã chết trên xem tạm dừng. Phương pháp của bạn gần như có vẻ đơn giản để làm việc như là, nhưng nó chắc chắn sẽ cho tôi một nền tảng. Trong thời gian chờ đợi, tôi hoan nghênh thông tin mới từ những người khác :) chúc mừng – IAmTheAg

+0

Tuyệt vời, hãy cho tôi biết nếu bạn khắc phục sự cố và cách thực hiện. Càng có nhiều ý tưởng, càng tốt. –

2

tôi chỉ gọi một chức năng bản đồ trên tất cả các trẻ em của hiện trường và thiết lập thuộc tính dừng lại để đúng

self.children.map{($0 as SKNode).paused = false} 

Bằng cách đặt nó vào đúng bạn có thể dễ dàng khôi phục trở lại đóng băng.

EDIT: Sử dụng tốt hơn vòng lặp for để lặp qua các trẻ em.

for node in self.children as [SKNode] { 
    node.paused = false 
} 
0

Tôi cũng sử dụng self.children.map{($0 as SKNode).paused = false} và nó không làm việc nếu bạn tạo một lớp var loại SKSpriteNode và thêm nó trên đầu trang của bối cảnh đó. Nhưng tôi cũng có một NSTimer tôi đang sử dụng để tạo ra các sprites trên hiện trường. Tất cả mọi thứ hiện tại trên hiện trường bị tạm dừng, nhưng sprites tiếp tục xuất hiện và di chuyển trên màn hình. Nó không phải là tạm dừng sinh sản.

Tôi đã thử tạm dừng NSTimer khi tôi gọi mã trên bằng cách đặt lặp lại thành false, sau đó đặt thành đúng khi tôi xóa lớp nhưng nó không hoạt động.Tôi cũng đã thử self.scene?.view?.paused = true nhưng đóng băng mọi thứ và lớp tôi tạo thậm chí không xuất hiện trên màn hình.

0

Chức năng này hoạt động hoàn hảo nếu bạn không sử dụng NSTimer để gọi hàm. Nếu bạn sử dụng NSTimer, chế độ xem của bạn sẽ tạm dừng hoàn toàn nhưng khi bạn chơi lại trò chơi bằng chức năng chơi trò chơi, bạn sẽ thấy tất cả các chức năng sử dụng chức năng NSTimer chạy ở phía sau và màn hình của bạn đầy với sprite-kits. Vì vậy, khi bạn sử dụng NSTimer trong hàm, trước tiên bạn phải tạm dừng các hàm NSTimer sau đó hàm này hoạt động hoàn hảo.

//For Pause 
func pauseGame() { 
    scene?.view?.paused = true 
} 

//For play. 
func playGame() { 
    scene?.view?.paused = false 
} 
0

Bạn cần đặt đại biểu cho Chế độ xem!

func PauseGame(){ 
    self.scene.view.paused = true 
} 

fun playGame(){ 
    self.scene.pause = false 
} 
Các vấn đề liên quan