すてにゃん氏の技術ぶろぐ

技術っぽいこと書きます

Gopher Night # 2 でENGiライブラリとGo言語によるゲーム開発についてLTしました

こちらのイベントにLT参加しました。
eure.connpass.com

LTですが話したことについてこちらに書きます。

前置き

Goとはどういう言語なのか

LTすると決まった時点で、正直Goをまだほとんど触っていなかったので、ひとまず A Tour of Go を読み進めました。これを読むだけで簡単な概要はわかって便利です。
A Tour of Go

私が受けた印象としてはC言語に構文が似ていて、でもC言語ほどメモリーとか低レイヤーのこと気にしなくても良い感じなのかなと感じました。

Goの何についてLTをするか

突然LTをするといっても、準備期間もあまりなかったのでどうしようか迷いました。色々調べてるうちに awesome-go というリポジトリを見つけました。便利そう。
github.com
この辺のライブラリを使ってみた紹介みたいなLTにしょうと思いました。

大学ではゲーム開発専攻だったので、OpenGLを使って何かしようかなと思い、go-glというライブラリを見てましたが、単期間でしかも馴染みのない言語だとできたとしてもちょっとした物の描画で終わってLTとしてはつまらないかなと思って、そこまで低い層ではなく、ある程度やってくれるライブラリでゲームを作ろうと決意しました。ということで今回ENGiというライブラリを使ってゲームを作ってみました。

今回作ったゲーム

さて今回はGopher Shooterという、Gopher君となって、敵Gopherをひたすら倒すゲームを作りました。以下、様子です。
f:id:stefafafan:20160624181225p:plain

よくあるシューティングゲームですね。画面上から赤・青・緑のGopher君がいろんな動きしながら降ってくるのでちゃんとした色のGopher君を矢印キーで操って、スペースボタンを押して口から「Go」を出して倒します。無限に続きます。

どのように作ったのか

まずENGiの使い方を調べようってなって、リポジトリを見ました。
github.com

READMEにはインストール方法ぐらいしか書いてない上に、

SUPER ALPHA Expect bugs and major API changes. Just a proof of concept at the moment.

と書いてありました。SUPER ALPHAはさすがにちょっと気になりますが、今回はLT用なのでまあ良いかなということで使いました。で結局GoDocのほうも見ましたが、関数名とか引数とかしかわからなかった
godoc.org
ので、デモのコードを参考にすることにしました。


例えばこちらのhello.goはとても基本的なコードで41行しかないのでわかりやすかったです。
engi/hello.go at master · ajhager/engi · GitHub

ENGiでのゲーム開発

デモを見た感じだと大体こういう流れだと理解しました。

  • Preloadで画像を読み込み
  • Setupで色々準備しつつ
  • Updateで色々と状態を更新し
  • Renderで描画
  • Keyでキーボード入力のあれこれするイメージ

このノリでGopher Shooterは200行程度で完成しました。慣れない言語でシュッと数日で作ったのでこれでも無駄な部分は多そうです。

どんなコードなの

正直に言うと色々と雑なので(がんばって動くものを作ったという感じ)、できればリファクタリングしたいところですがあえてそのまま公開することにします。
github.com

感想

Golang、書きやすいと思いましたが、ちゃんとこう書くと決めないとすぐ汚くなりそうだなと思いました。どの言語でもそうだと思いますが。あとC++のクラスみたいな感じではなくてstructみたいなのに色々くっつけるみたいなのがちょっと慣れなかったですね。他にはC言語とかC++で明示的にメモリー解放するみたいなのをGolangでもやろうと思ったけどよくわからなかったのでとりあえず配列から省くみたいなことしてたけど、省いただけじゃメモリーは解放されないよねみたいなモヤモヤしてたのでもうちょっとちゃんと調べたいなと思いました。でもENGi、シュッとこんなちょっとしたゲームが作れるのは手軽でよかったですね。