iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 18
0
Software Development

從讀遊戲原始碼學做連線遊戲系列 第 18

Day 18. 實作練習 - 準備與規劃

關於遊戲實作的部分在 Unlight 的原始碼中有太多東西可以參考跟學習,前面半個月的時間我們已經將連線遊戲中最主要的機制了解,透過運用 Socket API 跟指令系統,還有 Singleton 這個設計模式就足夠讓我們架構出一個簡單的連線遊戲。

首先,我們要稍微準備一下開發環境跟工具。為了可以專注在連線遊戲上,我們就不考慮使用 Unity3D、Unreal Engine 或者 Pixi.js、Phaser.js 這類直接開發遊戲的選項而是選擇一個能有直接運作的基底,並且可以直接拿來使用的工具。

另一方面,為了方便串接以及能夠快速時做出指令系統的雛形,我們選擇使用 WebSocket 來開發。目前大多數主流的語言都有實作 WebSocket 的工具,搭建環境上的教學也是相對多跟充足的。

作為一個 Ruby 工程師自然要選擇熟悉的工具跟環境,因此這個實作會用 Ruby 跟 JavaScript 來進行。

我們需要這些工具跟環境:

  • 推薦使用 macOS 或是 Linux
  • 建議是 Ruby 2.6 以上
  • RPG Maker MV 版本(Steam 上可以買到,推薦在特價時再購入)

伺服器跟客戶端可以分開實作如果使用 Windows 的話也可以考慮使用虛擬機來搭配開發。

上述幾個環境唯一需要安裝的只有 Ruby 的環境,如果是 macOS 的話可以直接使用 brew install ruby 進行安裝,如果是 Linux 的話則建議用 rbenv 或者 RVM 才比較容易裝到相對新的 Ruby 版本,可以的話也推薦 macOS 使用者選擇 rbenv 或 RVM 方式安裝。

如果在 Ruby 上安裝有困難,可以參考龍哥的為你自己學 Ruby on Rails 這本書,裡面有每個作業系統的安裝教學。不過我們實作的環境會需要編譯一些東西可能是 Windows 不支援的項目,因此還是推薦用 macOS 或者 Linux。

考慮到 RPG Maker MV 的特性,適合我們練習的是類似 MMORPG 的連線遊戲,因此我們首要的目標是先設計出一個地圖伺服器並且可以看到其他玩家,並且能夠記錄每個玩家在地圖上的座標跟呈現移動的狀態。

接下來先評估一下會需要用到哪些東西,雖然大多數人聽到 Ruby 都會覺得是 Ruby on Rails 不過實際上純 Ruby 實作也是完全沒問題的,我們從 Unlight 使用 Ruby 作為伺服器就可以知道這件事情。不過雖然 Ruby on Rails 好用,而且 ActionCable 也提供了 WebSocket 的機制,但是如果我們採用 ActionCable 的話反而就無法練習到指令系統了,因為 ActionCable 其實已經實作了類似的東西,反而不需要我們自己在另外實作。

Ruby on Rails 在眾多框架中仍然具有強大的競爭力的原因之一就是大多數的東西都已經有一個「框架」存在,工程師只需要加上所需的部分就能運作這對需要快速開發原型的專案是非常有幫助的。

套件

這邊簡單介紹一下 Ruby 會使用到的套件,至於 RPG Maker MV 本身就足夠使用因此我們要做的是基於前面了解到的技巧製作成插件加入 RPG Maker 之中。

Rack

可以算是 Ruby 的標準函式庫,裡面定義了 Web 伺服器應該要實作介面。大部分提供給 Ruby 使用的 Web 伺服器都是基於這個介面來實作的也因此能夠在不同的 Web 伺服器中切換。

Puma

目前主流的 Web 伺服器,另外我們也能夠透過 Puma 幫我們管理 Thread 連線(Puma 預設是基於 Thread 的)

faye-websocket

Faye 算一個跨語言的套件,在這邊我們可以很輕易地利用 Faye Websocket 基於 Rack 將普通的 HTTP 請求轉換成一個 WebSocket 連線。另外 Faye WebSocket 也是基於 EventMachine 所設計的。

Zeitwerk

在 Ruby on Rails 6 導入的 Auto Loader 套件,大多數人在開發時都會經常的重開伺服器或者重新執行。不過基於這個套件我們就可以做到不重開伺服器,單純只要在客戶端重新連線就能套用新的實作。

rb-fsevent

因為 Zeitwerk 並無法自動重新讀取,因此需要依靠檔案變動來呼叫 #reload 方法重新抓取改變過的程式碼,而 rb-fsevent 就是用來監控 Filesystem Event 的套件(Ruby on Rails 也是使用這套)

Sequel

如果用過 Ruby on Rails 就會知道 ActiveRecord 這個 ORM 套件,不過我們也可以嘗試看看另一款替代方案 Sequel。

Unlight 也是使用 Sequel 目前有不少專案如果沒有使用 Ruby on Rails 則會使用 Sequel 作為替代。

SQLite3

Sequel 只提供了 ORM 機制,因此資料庫的 Adapter 還是需要自己安裝,為了簡單起見我們直接使用 SQLite3 做為資料庫。


這幾年被討論很多的大多是 Web 類型的應用,不過實際上每個程式語言都有非常多不同的應用方式。

因為框架越來越多,我們反而越來越依賴框架帶來的好處,很少回過頭來看看語言本身能做到哪些事情。後續我們會嘗試用類似於 Ruby on Rails 的方式架構專案,並且在不依靠任何 Ruby on Rails 的套件進行開發。

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


上一篇
Day 17 - Singleton 的應用(二)
下一篇
Day 19 - 實作練習 - Server 雛形建立
系列文
從讀遊戲原始碼學做連線遊戲33

尚未有邦友留言

立即登入留言