我有一個關於編程網絡遊戲上的客戶端/服務器通信的一般問題。 我使用TCP作爲協議,並且通信...有效,但我不確定,如果這是一種有效的方式。GAMEPROGRAMMING通過....進行客戶端/服務器通信? (JAVA)
在一般情況下,在客戶端所發生的行爲會throught所有這些步驟:(例如火球正投)
- 一些行動
- [*]對於這個動作我定義了一個字符串(例如#F#270#130#,這意味着'F'表示它是一個火球,270是(例如)角度,130 - 火球的速度是射擊。)
- 字符串進入客戶端的輸出緩衝器&等待隊列
- 字符串被髮送
- 字符串被服務器接收
- [*]服務器需要一個可以檢測字符串含義的行解釋器(這裏:什麼意思是F?這是一個火球!)&增加了一個唯一的身份,基於,從哪個客戶端收到命令。
- [*]服務器需要根據發生的動作計算邏輯(火球對別人造成傷害,是否立即觸及某人或立即飛行)
- 服務器發送一個(更新的)字符串所有客戶都會採取的行動。 (例如,也許火球速度由於某種原因減速 - 這裏將是一個更新的字符串(#F#12345#270#90# - 12345是唯一的玩家身份)
- 客戶端接收字符串
- [* * ]客戶端將字符串解析爲命令+處理它(觸發動畫序列...)
- originaly發送命令的客戶端將收到的字符串與等待隊列中的字符串進行比較 - 當相等時,不執行任何操作(平滑某些操作,否則通過連接問題/延遲,一些動作會發生兩次或跳轉從一個位置到另一個位置,基於ping
真的有必要通過所有t這些步驟?在所有標有[*]的步驟中,我需要爲每個命令定義新的行解釋器/操作,因此我將每個操作編碼兩次,客戶端爲&服務器端。 我讀了一些關於發送可序列化對象的東西,但在genereal中,這個想法對我來說似乎是一樣的,我發送一個對象,該對象必須被解釋+處理,並且我發回一個對象...
任何提示?爲了解決整個溝通更優雅,用更少的代碼?或略偏分類 - 所有這些#樓##男尋找不同的動作##^h#標籤使它越來越複雜:)
(其實我確實有如下處理/操作:
- 移動 -Look /旋轉 -hpchange -firearrow -spawn /斷開 ...)
希望你明白我的意思 - 我知道,我可能只是繼續編碼一樣的是,它會以某種方式工作,但它似乎太複雜了,因爲它可能是。
謝謝!
還有更多:)字符串被髮送,字節被轉移到服務器,字符串被服務器接收,其他100個步驟你沒有提到 – Tala