前言
假期間翻找學習資源,找到了一個用go
進行遊戲開發的課程,雖然在遊戲產業還是以C#
的Unity engine或godot較廣為人知,go就拿來試試看,順便玩一下實作,找點實際應用的感覺。
開發框架Ebitengine
Ebitengine是一個使用go語言進行開發遊戲的引擎,可以簡單快速的開發2D遊戲,部署到跨平台上運行。對於windows系統的開發者來說,只要go安裝完成,即可進行一般套件管理後進行開發,如果是mac或是Linux,則需要多安裝C語言的編譯器。 Go 版本須為1.22 以上,WSL使用者則需要GOOS=windows
的環境變數
專案初始化
創建一個新資料夾,打開終端機鍵入go mod init <專案名稱>
進行初始化,自動產生go.mod
檔案,紀錄專案依賴版本資訊。
module go-game
go 1.23.0
輸入指令go get github.com/hajimehoshi/ebiten/v2
,安裝ebiten依賴,完成後自動產生go.sum
。此時如果在後續開發中還是找不到依賴,記得下go mod tidy
指令進行刷新。
官方範例
// 省略import
type Game struct{}
func (g *Game) Update() error {
return nil
}
func (g *Game) Draw(screen *ebiten.Image) {
ebitenutil.DebugPrint(screen, "Hello, World!")
}
func (g *Game) Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int) {
return 320, 240
}
func main() {
ebiten.SetWindowSize(640, 480)
ebiten.SetWindowTitle("Hello, World!")
if err := ebiten.RunGame(&Game{}); err != nil {
log.Fatal(err)
}
}
基本內容就是實作引擎所提供的Gameinterface
,實作方式類似Duck Typing,只要行為符合interface
的定義就算是完成實作。
以範例來說,即自定義的Game struct
需要有符合下列三個function signiture
的receiver function (method)
。
- Update() error
- Draw(screen *Image)
- Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int)
階段進度
目前暫時是完成這些處理
- 嵌入靜態資源圖檔,更新繪製在畫面上
- 偵測按鍵輸入,左右鍵旋轉,上鍵前進
- 邊界處理
後記
遊戲開發是能學到不少東西,尤其是要管理大量的物件生命週期,各種為了維護性而套用的架構,以及久違拿出來用的高中數學,好險sin、cos跟向量都還記得,不至於看不懂為什麼做出來的公式是要這樣套。
總而言之,一方面延伸了解一下遊戲開發的機制,一方面熟悉一下go語言的語法。