2013-03-19 41 views
5

我正在研究一個簡單的基於回合的文字遊戲,並且我很難弄清楚邀請函是如何工作的。當用戶A邀請用戶B參加遊戲時,我希望用戶B能夠在我的自定義比賽界面(即列出所有用戶B的遊戲的屏幕)中看到該遊戲。如果用戶B在被邀請參加遊戲時點擊通知,事情就沒有問題,但如果用戶B自己導航到應用程序,我仍然希望通過自己的界面可以看到遊戲。在沒有遊戲中心視圖控制器的情況下處理GKTurnBasedMatch的邀請

每當此匹配界面屏幕出現時,我使用[GKTurnBasedMatch loadMatchesWithCompletionHandler:]來獲取所有本地球員的比賽。有了這個,我會假設用戶B能夠看到他被邀請參加的比賽,但是這個新的比賽沒有出現。如果我通過GKTurnBasedMatchmakerViewController接受邀請,則用戶按預期進入遊戲,但是更令人費解的是,如果我打開我的GKTurnBasedMatchmakerViewController,然後取消不接受邀請,現在會在我的自定義比賽中顯示新的比賽接口,但它缺少用戶A發送的匹配數據。

總之,我真的只是想知道如何正確顯示和接受GKTurnBasedMatch邀請與自定義接口(而不是必須使用GKTurnBasedMatchmakerViewController)。謝謝!

回答

0

這個問題似乎引起了一些人的興趣,所以這裏粗略地說明了我最終做了什麼。

首先,新比賽根本沒有出現的原因只是我並不是每次想讓視圖像我一樣刷新視圖時,我都不會打電話給[GKTurnBasedMatch loadMatchesWithCompletionHandler:]。所以我記得那裏沒有真正的問題。

真正的問題是我收到並顯示新GKTurnBasedMatch的情況,但沒有任何數據(即對手玩家的第一招)可用。本質上,[GKTurnBasedMatch loadMatchesWithCompletionHandler:]似乎不能保證爲您提供可用的最新GKTurnBasedMatch對象。爲了確保比賽是最新的,我必須在[GKTurnBasedMatch loadMatchesWithCompletionHandler:](其中match是其中一個GKTurnBasedMatches)返回的每場比賽中致電[match loadMatchDataWithCompletionHandler:]。這將返回與該匹配關聯的最新匹配數據,作爲NSData對象。然後我可以使用這個NSData來確保我比賽表中的所有比賽都被刷新,以反映遊戲中心的最新變化。

簡而言之,在GKTurnBasedMatch對象上使用loadMatchDataWithCompletionHandler以確保其數據是最新的。

+0

我在執行加載匹配方法中實現加載匹配數據之前,也遇到了無法查看最近輪次的問題。值得注意的是,它只能在匹配輸入時延遲加載匹配數據,而不是一次加載所有匹配數據,這會在不使用WiFi時真的減慢呈現匹配的UI。 – Corbin87 2014-03-02 18:32:12

+0

我想確保我明白你在說什麼。我正嘗試從玩家A向玩家B發送一個邀請,並且我希望玩家B能夠在他們回覆之前在他們的匹配列表*上看到邀請。換句話說,當我爲B調用'loadMatches'時,它應該顯示所有匹配的活動,以及他們被邀請的所有匹配,*無論他們是否響應了邀請。*看起來好像就像你說這是你的事情。我很困惑,因爲對我而言,B從來沒有看到他們被邀請參加的比賽。 – 2017-03-07 19:53:21

+0

在我問到這個問題之後,我想清楚了,但是我想留下這個問題以防其他人擁有它。關鍵在於,邀請不會出現在玩家的名單上,直到*輪到他*爲止。遊戲中心有一個範例,希望您能夠在接受邀請後立即玩遊戲,因此它會阻止回合制邀請,直到被邀請的玩家可以立即行動。對於遊戲開始前玩家需要互動的遊戲來說,這是蹩腳的,但是你去了。 – 2017-03-07 19:58:47

0

更新:現在包括接收邀請的實際答案。

我一直在努力以編程方式處理接近一週回合制比賽的邀請。我終於找到了答案。我要超高亮它,因爲我花了這麼發現:

遊戲中心對待回合制邀請,變故。他們是而不是像其他邀請一樣處理。

回合制的事件在該函數處理的GKLocalPlayerListener協議:

player(_ player: GKPlayer, receivedTurnEventFor match: GKTurnBasedMatch, 
     didBecomeActive: Bool) 

當您收到了比賽,請檢查您是否正在邀請它,和急。你已收到邀請。

但是:

經過令人沮喪的試驗和錯誤我已經發現了一些注意事項,希望它可以爲您節省一些嚴重的時間:

  1. 它只是普通的並不總是奏效。相信與否,Game Center是不可靠的。這意味着您需要一個備份系統來審查您的本地玩家的公開比賽,並搜索他們的新邀請。這本身就屬於警告#2。
  2. 被邀請參加比賽的球員(例如說playerJake被邀請參加matchFoo)實際上並不會收到的邀請,也不會在loadMatches返回的比賽中看到該比賽,直到輪到他們。顯然,Game Center實際上並不涉及任何球員在比賽的邀請名單以任何方式直到輪到他們。
  3. 如果您可以識別您受邀參加的比賽,但尚未回覆,您必須直接在之間撥打acceptInvite(...)。因此,如果playerJake檢查了loadMatches檢索到的比賽,並且能夠檢測到matchFoo仍然有公開邀請,playerJake必須撥打matchFoo.acceptInvite(/* ...completion handler stuff here... */),然後快樂的playerJake關閉並運行。

從這裏你應該能夠得到你自己的編程匹配系統的工作。 祝你好運,我的意思是!

相關問題