2015-10-04 285 views
3

我一直在爲iOS構建遊戲中心遊戲,目前效果很好。我終於開始測試遊戲了(顯然)有一些延遲,這會導致遊戲不同步。iOS遊戲中心遊戲不同步

基本上我有2個玩家,每個玩家控制一個遊戲角色。遊戲角色可以射擊火球和冰球等。這些攻擊會造成傷害,並且會產生影響。例如。如果接觸,冰球效果會將對手凍結3秒。火球會持續3秒的火焰傷害。

所以問題是,當我與哥哥比賽時,由於等待時間的原因,我的比賽說我剩下40個健康狀態,他已經下降到0,而在他的設備上,比賽說我有0,而他有20個。

這意味着攻擊是在一個設備上註冊/碰撞(基於角色/火球的位置),而不是在另一個設備上。反之亦然。

我目前使用的是默認的點對點遊戲中心體系結構。會使用客戶端 - 服務器架構(一個人成爲服務器)解決這個不同步的問題嗎?

如果不是,我還有什麼其他選擇與遊戲套件API?

+0

你使用tcp或udp連接嗎? –

+0

@JiriTrecak實際上並不確定。讓我仔細檢查 –

+0

@JiriTrecak我認爲這是使用tcp。將使用udp使傳輸或數據更快? –

回答

1

我找到了解決這個問題的辦法。

注意:這將是一個相對較長的答案。我並實現

的一件事是我的一些數據傳輸是不是別人一樣重要的使用udp。例如,由於我每秒發送約10次移動數據,因此我認爲10次中有1次或2次偶爾會丟失。


我們實際的問題:


所以發生了什麼事是以下各項,因爲我使用的是p2p架構,無論客戶有延時,當他們看到遊戲「世界'。這意味着在我的設備上,我看到敵方玩家的位置延遲了100-200毫秒。 (所以他實際上在過去有100-200毫秒)。

這個問題是,當我向敵人射擊時,我發現碰撞,如果碰撞正好在他的精靈邊緣(他的腳或頭),在他的屏幕上,他已經是過去那個位置 - 加上 - 我的火球在屏幕上延遲了100毫秒。這意味着在他的設備上,他能夠躲避我的攻擊。這可能發生的次數是隨機的,但我猜它可能低於30%的時間。 70%,兩臺設備都能看到碰撞。


解決方案


我想出什麼樣的主意是當任一設備都可以看到一個碰撞發送消息給其他玩家。請記住,每個設備都不知道對方是否發生了碰撞。所以我無法知道這兩個設備是否發生了碰撞,或者只有一個,而另一個設備看到這個攻擊被閃避了。

這意味着每次碰撞時我都必須發送消息給其他玩家。現在,由於我設計我的遊戲的方式,發送碰撞時,我會自動應用碰撞事件(意思是說,發生的破壞,發生的彈丸效應 - 例如冰球凍結與其相撞的玩家)。是有問題的,因爲如果兩個設備看到了碰撞。這意味着兩個設備正在發送相互衝突的消息,並再次應用衝突。爲了解決這個問題,我爲每個咒語/攻擊添加了一個「咒語編號」,當碰撞發生時,我將這個編號與發生碰撞的玩家保存爲「最後的碰撞咒語編號」 。因此,如果與該咒語發生碰撞,玩家知道他/她已經與該特定物體發生碰撞,所以碰撞邏輯不會運行兩次。