Go&Ebitengineをやってみる
はじめに
何となく新しい言語を勉強しようと思い、Goを選んだ。
動きのあるものを作りたいなと検索したら2DゲームエンジンであるEbitengineが出てきたので採用。
どちらも初心者なので実績はゼロであり、ポエムだけ書いてもしょうがないしとりあえずコードを出してから始めるスタイル。
Githubに置く
置いた。初めてのGoプログラムということでしょぼいが。
Web関連は初心者どころじゃないのでちょっとアレですまぬ。ゲームではないのだがな。どこ直せばいいのやら(なんかEbitenSampleTestって出るようにできたので変更しといた)
コードはこっち。
Wasmgameなるツールがあって、Githubで公開が簡単にできるらしいのだが、使ってみるとGithub側のバージョンアップやらなんやらでエラーになり、いくつか修正したが直しきれなくて断念。toolだけもらってActionsじゃないGithub Pagesで手動で配置した。ツールもGoの1.25.1だとwasm_exec.jsの場所が変わっててエラーになったからちょっと手直しした。
あと、ブラウザで動くならスマホで操作したいと思ってタッチ対応してみたが反応しなかった。何が悪いのか調べようにもデバッガ使えんし手間なので諦めて放置することにした(動くようになったので更新しといた)
これは何か
四角をドラッグしてぶつけたら色が変わる。だけ。
ドラッグ時に引っ張られているっぽく回転してみせるのと、そのために回転した矩形の衝突判定をわざわざ実装しているところがポイントであり、それ以外に見るべきものは無い。
作ってみたサンプルである。
所感
ここからポエム。
Goについて
Importが死ぬほど楽。Githubからライブラリを引っ張ってくるのに苦労することが一切無い。Cみたいにいちいちヘッダ書かなくていいのも良い。
インターフェースが独特。JavaやC#みたいにオブジェクト指向じゃないから型で縛られていない。ダックタイピングしてる。
継承が無いからちょっと大きめのものを作るときは設計思想から見直さないといかん。これは今後の課題。
構造体のインスタンスとポインタが、どっちでも気にしなくていいようになってるけど、気にしないといけない部分もあってよくわからなくなる。慣れの問題か?
書き味がよろしいので細かいユーティリティとかを自分で作っていきたくなるが、たぶんGithub探したらなんでも出てくる気がする。ユーザ数多いし。
Ebitengineについて
現状ほとんどの機能を使っていないので語ることもあまりないのだが、まず動かすのが簡単でとても良い。描画はGeoMでどうのこうのになるのでちょっと煩雑。柔軟ではある。個人的には好み。
対応プラットフォームが多いのも良い。ブラウザでそのまま動くとか神かと。
色に関して、GoのColorだったりEbitenのColorScaleだったりして、知っていれば簡単なのかもしれんけど、どういう値を渡して生成するものなのかがわからんくてしばらく悩んだ。
2Dゲームエンジンだが、2Dゲームによく使われるものが用意されていないのは、まあ、コンパクトな仕様ということで。Ebitengineユーザーはそういうこまごまとしたものを作って構築してくのが好きな人なのだろうし、俺もそうだし、問題なさげ。
Github Copilotさん
VSCode使ってGithub Copilotに手伝ってもらった。メソッド名を書いたら中身書いてくれるし、コメントも自動で書いてくれたり、コメントと最初のあたりのコードを書いて誘導するとちょっと込み入った処理も書いてくれる。
RectのCheckPointとCheckBoxはCopilotさんがほとんど書いた。分離軸判定も自分で実装できるけど、慣れない言語でちょっと面倒だったから、コメントで誘導したらさくっと書いてくれた。これはつまりこの手の判定を学習しているということであり、Githubで探したら普通にGoで実装されててImportして使えたりするのかもしれん。Copilotさんは似たようなコードを量産する仕組みってことでいいんだろうか。どうなんだそれ。
RectのMoveメソッドはCopilotさんではどうにもならんかったから自分で書いた。頑張ってコメントで説明すればいけそうだが、それなら自分で書いたほうが速い。業務システムなんかも仕様を日本語で書いてAIに実装してもらうなら、たぶん仕様を書くのが大変なことになるだろうと思う。
作ったものに関して
衝突判定に関しては分離軸判定をしている。CheckPointは点と回転した矩形なので矩形を元の姿勢に戻すように点を回転させて判定する。CheckBoxは回転した多角形同士の判定になるが、矩形であれば4つの辺は2つずつ平行になるので判定する軸を半分にして簡略化している。
Moveのほうはちょっと説明しづらいので端折る。奇妙な動きをしているが単純な幾何学的計算(6行)をしているだけである。Goでこれを作ってみたいと思ったからEbitengineに手を出したとも言える。
衝突判定の処理はGoぽい仕様でなんか作ってみてもいいかなーなど考えている。例えば、GetRegion、GetPos、GetRadみたいなメソッドを持ったインターフェースを作っておいて、それを実装した構造体同士で衝突判定ができるとか?
うん、Go初心者だからどういうのがGoっぽいかよくわからんな…。
おしまい
目的も何も無いので本格的にやるかはわからんけど、また何か考えたら作ってみると思う。
Discussion