iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 2
1

既然要開發連線遊戲,最一開始需要的思考的問題就是「玩家之間該怎麼連線?」

基本上如果要產生一個連線的話,勢必會有人要扮演伺服器的角色。如果是多人連線遊戲的話,大多是由營運的公司提供一個中央的伺服器。而團隊合作的遊戲,可能會是透過區域網路連線,由開設遊戲的玩家負責扮演伺服器的角色協調跟同步其他玩家的操作。

那麼,要透過網路進行連線,就會需要透過 Socket API 來協助我們在不同的電腦上建立連線。

在大多數的程式語言中,我們都有一定的手段能夠操作 Socket,想要開發連線遊戲的話基本上就會需要透過這種方式來讓玩家跟伺服器產生連線。根據遊戲類型的不同,會採取不同的方式,以 MMORPG 來說可能會為了傳輸的順暢度混合使用 TCP 和 UDP,像是把 UDP 用來廣播一些即使沒有收到也不會有很嚴重影響的訊息,而 Unlight 因為遊戲節奏的設計跟對戰系統等等需要確實接收到指令但是又不嚴重影響順暢,可能就會單純以 TCP 連線的方式來做處理。

關於網路連線的部分我們邊就不多討論,這篇我們先建立些簡單的概念大概了解連線遊戲中的「連線」是如何運作起來的。

以 Ruby 為例子,想要建立一個 TCP 伺服器可以像這樣撰寫(以下為簡單的 EchoServer 示範)

# frozen_string_literal: true

require 'socket'

server = TCPServer.new 12_000

loop do
  client = server.accept # 伺服器接受連線
  ping = client.gets # 從客戶端讀取資料
  puts "< #{ping}"
  client.puts ping # 發送資料到客戶端
  puts "> #{ping}"
  client.close # 關閉連線
end

接下來我們就可以利用像是 telnet 指令來測試

# telnet localhost 12000
Hi
< Hi
> Hi

當我們輸入 Hi 按下 Enter 後,伺服器也會回應一個 Hi 並且馬上關閉連線。

透過這樣的方式,我們就能夠利用 TCP 連線跟玩家互動。不過並不是所有的環境都能夠直接使用 TCP 連線來開發連線遊戲,以 Web 作為平台的遊戲就無法直接在 JavaScript 上面建立 TCP 連線取而代之的是使用 WebSocket 這種替代的方式,將 HTTP 連線轉換成持續的連線,再透過 WebSocket 封裝一次資料後作為類似 TCP 連線的形式存在。

另一方面,像是一些簡單的文字對話遊戲或者手機遊戲,因為本身沒有即時連線對戰的需求,所以也不一定需要隨時保持玩家跟伺服器的連線。取而代之的可能會是直接使用 HTTP API (不一定是 RESTful)利用 HTTP 伺服器容易實作與相對容易上手開發的框架來節省開發跟維護上的成本。

下一篇我們會來討論 Unlight 是怎麼實作伺服器端的 TCP 連線,這篇文章所示範的 EchoServer 很明顯過於基礎並且不足以處理連線遊戲所需的機制。

在練習的過程中可以試著把一些邏輯加到裡面,製作成類似 MUD 的形式,就能夠變成一個相對簡單的小遊戲。

我的個人部落格是弦而時習之平常會把自己發現的一些新技巧紀錄在上面,也歡迎大家來逛逛。


上一篇
Day 01 - 要怎麼做連線遊戲?
下一篇
Day 03 - Client 與 Server 的溝通 - 同時處理多個連線
系列文
從讀遊戲原始碼學做連線遊戲33

尚未有邦友留言

立即登入留言