2012-09-29 68 views
1

我正在嘗試使用套接字爲Java後端編寫多人遊戲,但我不知道如何做某些事情。java中的實時套接字

例如,我有玩家。第一位玩家按下「UP」按鈕,他的頭像向上移動。我怎麼能告訴所有其他玩家?

我可以發送消息,有些ID用戶改變了他的座標到新的X和Y,但我需要做的,每毫秒,當他移動。是對的嗎?

或者,我可以發送消息的一些ID用戶推按鈕,新的消息後,該用戶發佈的UP按鍵。使用這兩個事件之間的時間差和移動速度,我可以計算出用戶的新座標,但在這種情況下會出現延遲問題(時間差計算不夠準確) 我該怎麼做?

回答

5

你可以用很多方式做到這一點,所有的問題都會像你已經找到的一樣。我想沒有「最好」的方法來做到這一點。

遊戲的常用方式是擁有「遊戲服務器」。服務器接收來自所有客戶端的輸入並決定結果狀態。

客戶端例如可以只發送按鍵,服務器會告訴他們關於他們的位置和需要繪製其它客戶端的位置。客戶端在本地執行相同的數學計算,並在等待來自服務器的確認時顯示此狀態。但這只是一個預測。

當滯後可以觀察自己在很多比賽位置之間的跳躍,因爲實際的服務器計算的位置和你的預測了不同步的。

的服務器端的狀態決定的另一個優勢是,客戶不能欺騙,很容易。防止每一個作弊都不是萬無一失的。例如瞄準機器人只需通過移動鼠標來模擬完美瞄準的用戶,這基本上是不可檢測的。另一方面,通過簡單地不告訴客戶關於當前不可見的事情,可以防止映射黑客/牆上黑客(任何可以看到你不會看到的東西)。只有服務器需要知道完整的狀態。

服務器方法也可以在沒有專用遊戲服務器的情況下使用。相反,其中一個客戶端將具有服務器角色並決定遊戲狀態。如果原始主機退出,某些遊戲甚至可以在客戶端之間切換。如果發生這種情況,順利移交雖然很棘手。

如果沒有服務器,並且所有客戶端負有同樣的責任,那麼您將不得不考慮架構,該架構定義哪個客戶端負責驗證哪個操作。例如在射手中,A在某個方向射擊,並且認爲B仍然在那裏,但是B已經移動了一點,現在A認爲「B被擊中了」而B認爲「射門錯過了」 - >無論是一次射擊還是被擊中的人應該決定發生了什麼。

與多個決策各方一個模式可能並不適用於每一場比賽工作,這是一個非常複雜的任務。不僅適用於遊戲,而且distributed computing in general

Java和套接字只是這裏的工具。實際的問題是你應該拿筆和紙考慮適用於你的場景的模式。

關於每毫秒的座標:您還可以發送消息,如「我將在X點,Y在時間Z」,其他客戶端插入該播放器的路徑,因此您不必傳輸每個位置。