2011-10-27 73 views
5

我編寫了一個使用gamekit點對點連接的炸彈人應用程序。問題是過了一段時間,遊戲不再同步。遊戲工具包點對點

我看了GKTanks的示例代碼並使用了他們的模型。同伴之間沒有客戶端/服務器關係,所以我沒有在我的遊戲中使用它。兩個同伴都維護一個他們根據收到的數據進行更新的遊戲狀態。

我有一個NSTimer用於在每一幀運行gameloop。 NSTimers不同步,因此有時候遊戲狀態會變得不同:例如,玩家幾乎在同一時間選擇加電,並且兩者都獲得加電,因爲發送數據需要一段時間。

我將不勝感激關於使應用程序工作的任何想法。我正在考慮重寫代碼以使用客戶端服務器,但我不確定它是否是個好主意...但是

謝謝!

編輯:我改變了代碼,這樣隨機播放器被挑選爲主機。每當玩家放置炸彈時,他都會詢問服務器放置在哪裏。服務器返回玩家位置(如服務器上所示),然後告訴玩家放置炸彈的位置。

對於通電服務器檢查是否玩家拿起電源,如果他做了,它會發送一個數據包通知他。

現在又出現了另一個問題。設備之間的延遲很高(我正在使用藍牙連接)。客戶點擊按鈕放置炸彈後需要大約0.2秒的時間。

我正在可靠地發送所有數據。我做對了嗎?

回答

4

好preferbly你需要一臺主機與客戶的關係,其中僅主機可以操控遊戲狀態,所以在你的情況將是:

雙方球員衝向通電。 主持人首先撿起它。
它被註冊並且主機接收到啓動。
與此同時,玩家#2也接通電源,將動作發送給主機。
主機通知玩家#2開機已經消失。

與你的情況有關的事情你必然會從數據包丟失獲得desynchs。
由於無法發生主機 - 客戶端關係,唯一的問題是主機總是有一個優勢,當設備間的延遲增加時,特別是在智能手機上,總是會變得更大。

在像炸彈人這樣的遊戲中,每次發生某種變化而不是執行的動作時發送整個遊戲狀態是完全合理的,這是爲了確保兩個設備同步。

總結一下:兩個用戶都有他們的遊戲狀態,但只有主持人可以操縱兩者。

0

你應該做的:

  • 的設備之一是主機,另一種是客戶端
  • 主機過程中的所有遊戲狀態並作出決定,然後將其發送整個遊戲狀態到客戶端
  • 客戶端獲取遊戲狀態並根據它繪製所有內容 - 它不做任何決定(誰挑選炸彈,炸彈爆炸等)
  • 客戶端只是向主機發送輸入(按左,右,暫停等)

就是這樣。如果你試圖在兩臺機器上做出決定,你會遇到很大的麻煩,試圖讓它們保持同步。