Go言語はよくサーバー開発で使われていますが、ゲーム制作でもGoが使えますよ!
engi
今回紹介するライブラリーは「engi」です。
2Dゲームエンジンです。ちょっとXNA的な感じ。"SUPER ALPHA"なので、APIがよく変わりますが、とりあえず、engiのロゴを表示するdemos/hello.goを見てみましょう。
engiの使い方
インポート
まずインポートします。ライブラリーではなく実行できるプログラムなのでpackage main
になります。
package main
import (
"github.com/ajhager/engi"
)
engiが使っているウインドを表示してくれるazul3d.org/native/glfw.v4
というライブラリーはgo get
すると、自動的にGLFWをインストールするから、go get
だけで大丈夫です。
ゲームオブジェクトを定義
engiはengi.Game
という形に対してUpdate()
やRender()
を呼んでくれるので、*engi.Game
を組み込めばいいです。
type Game struct {
*engi.Game
bot engi.Drawable
batch *engi.Batch
font *engi.Font
}
bot
はengiのロゴのスプライトです。batch
はスプライトをrenderする際に使うSpriteBatch的な物です。font
はテキストを表示するためのテクスチャーなどが入っている物です。
スプライトなどを読み込む
GameのPreload()
が一番最初に呼ばれるメッソドです。定義するとスプライトとかを読み込めます。
func (game *Game) Preload() {
engi.Files.Add("bot", "data/icon.png")
engi.Files.Add("font", "data/font.png")
game.batch = engi.NewBatch(engi.Width(), engi.Height())
}
スプライトなどを用意する
Preload()
が終わってウインドが作られたら、Setup()
が呼ばれます。ここでPreload()
で読み込まれたファイルを使います。
func (game *Game) Setup() {
engi.SetBg(0x2d3739) // 背景の色
game.bot = engi.Files.Image("bot")
game.font = engi.NewGridFont(engi.Files.Image("font"), 20, 20)
}
表示する
いよいよDraw()
です。engiが勝手に呼んでくれるので表示ループとか書かなくてもOKです。
func (game *Game) Render() {
game.batch.Begin()
game.font.Print(game.batch, "ENGI", 475, 200, 0xffffff) // "ENGI"を表示
game.batch.Draw(game.bot, 512, 320, 0.5, 0.5, 10, 10, 0, 0xffffff, 1) // ロゴを表示
game.batch.End()
}
最後にmain()
package main
にするならmain関数が必要です。engi.Open()
を使います。
func main() {
// タイトル, height, width, fullscreen, Gameオブジェクト
engi.Open("Hello", 1024, 640, false, &Game{})
}
こうなります…
双方向にしよう
キーボードでロゴを動かせるようにしましょう。Gameのロゴのx, y変数を追加します。そしてこれから使うkeyMapを定義。
type Game struct {
*engi.Game
bot engi.Drawable
batch *engi.Batch
font *engi.Font
botX, botY float32
keyMap map[engi.Key]bool
}
Preload()
にkeyMapのmakeとデフォルト配置を入れます。
func (game *Game) Preload() {
...
game.keyMap = make(map[engi.Key]bool)
game.botX, game.botY = 512, 320
}
Render()
をbotX, botYを見るようにします。
func (game *Game) Render() {
...
game.batch.Draw(game.bot, game.botX, game.botY, 0.5, 0.5, 10, 10, 0, 0xffffff, 1)
...
}
GameのKey()
メッソドを定義すれば、キーボードイベントを対応できます。
func (game *Game) Key(key engi.Key, modifier engi.Modifier, action engi.Action) {
switch action {
case engi.PRESS:
game.keyMap[key] = true
case engi.RELEASE:
game.keyMap[key] = false
}
}
そしてUpdate()
メッソドで、keyMapに応じてロゴの配置を変えます。
func (game *Game) Update(dt float32) {
// dt = 時間差 (0.01635106とか)
var dx, dy float32
if game.keyMap[engi.ArrowUp] { // trueなら押されている
dy = -500
}
if game.keyMap[engi.ArrowDown] {
dy = 500
}
if game.keyMap[engi.ArrowLeft] {
dx = -500
}
if game.keyMap[engi.ArrowRight] {
dx = 500
}
dx, dy = dx*dt, dy*dt // 適当に時間差に応じて動かす
game.botX += dx
game.botY += dy
}
よし。これでアローキーを使って動かせます!
最後に
Go言語のゲームの世界はこれから広がります!ぜひGo言語でゲームを作りましょう。engiはgopherjs対応しているので、javascriptにもコンパイルできますよ!