Linuxで作ったゲームをWindows10で動かそうとした話

序文

1年くらい前からArchLinux環境でRustで弾幕シューティングを制作していた。(以下リンク)

https://github.com/celluloce/poi-project/

初期はPistonゲームエンジンで作ろうとしたが、超絶使いにくかったのでggezゲームエンジンに切り替えた。
精神療養のつもりで時々触る程度であったが、大学の文化祭で展示しようと最近になってえっちらおっちら進めた。
で、その過程で特にWindows10で動かそうとして苦労したことを書き示す。
(文化祭の展示には.exeファイルとして提出しなければならない)

ggezとは

SDL2依存の、Rustで書かれたゲームエンジン
2Dゲームを簡単に作れるのが特徴。
ソースコードを読む限り、SDL2に肉付けしたくらいの低級なゲームエンジン

Windows10でSDL2環境

上記の通り制作ゲームはSDL2に依存している。
でこのSDL2環境をWindows10で整えるのが超めんどくさかった。

ちなみにArchLinuxだと$sudo pacman -S sdl2打つだけで環境構築が終了する。

Rust-SDL2のドキュメントを参照してみる

GitHub - Rust-SDL2/rust-sdl2: SDL2 bindings for RustWindowsでの環境構築が書かれてたので試してみた。
がしかし部室のPCでRust環境を構築したのに、C:\Program Files\Rust\が存在しなかった。
Rustコンパイラ先生どうやって動いてるんだよ...

ちなみにこの時ブチ切れて「自分のゲームを遊びたいならUbuntuインストールして遊べ!」と暴言を吐いた。

MSYS2を使う

Linuxユーザの強い味方、MSYS2を使ってみた。
参照:http://takaya030.hatenablog.com/entry/2018/01/17/183235

サンプルコードが動かない等が起きたが、C++わからないので無視した。
で制作ゲームをコンパイルしたら通らない。
なんでだよ...

結局

某C++erに手伝って貰った。
RUSTFLAGS="-L/mingw64/lib" cargo build --releaseで何とかBuildできた。
他のアプローチとしては、build.rsを書いたりすることで解決するようだ。

ロスコンパイルすればいいのでは?

英文読む気力がなくしかもパッケージ依存が酷かったので諦めた。

ゲームを遊ぶのにSDL2環境構築は必要か?

Buildして.exeファイルにしてしまえば、あとは同じディレクトリにSDL2.dllを置くだけで実行できる。
置くだけでおk。
配布時も同封すればおk。

Windowサイズが巨大化

準備日直前にとりあえず展示できる形に仕上がったが、ディスク書き込み直前に後輩のWindows10環境で実行させてみたら、画面に収まらないほど巨大なゲーム画面が表示された。
1280*960サイズのゲームで、後輩PCは1920*1080だから余裕で収まるはずなのに。
というかフォントサイズもなんかおかしい。

画像上:理想
画像下:再現 f:id:celluloce:20181124000302p:plain

f:id:celluloce:20181124000004p:plain

とにかくフォントサイズは1.6倍すると丁度良い大きさになることがわかった。
で問題はWindowサイズが巨大化する現象で、これはWindowサイズを960*720に縮小するしか無かった。
でWindowサイズを1280*960固定で制作していたため、全てのキャラクタ描写や速度や位置を縮小版に合わせて書き換えなければならなかった。

まあX軸とY軸の値をそれぞれ(window x size) / 1280, (window y size) / 720倍にすりゃいいからそんなめんどくさい作業では無かった。
実際超めんどくさかった。
(具体的には初期値と値の更新の式いずれかに演算させるのだが、間違って双方に演算させてしまったりなど難航した)

この作業で文化祭前日の準備に全く参加できなかった。
後の楽しみは打ち上げのみになった。
ちなみに配布ディスクに修正版が焼かれることは無かった。

おまけ:オーディオ環境

Windows関係ない。

ggezを使って書かれたコードをオーディオ環境の無い(内蔵スピーカが壊れてたり等)状態で実行すると、ggezがAudioErrorを吐いて実行時エラーを起こす。

これはライブラリ外で設定できず(多分)、イヤホンジャックにイヤホンを刺す等をすると解決する。
なお制作ゲームにBGM等は無い。

まとめ

  • SDL2はマルチプラットフォーム対応(開発はLinux使おう)
  • ggezをWindowsで実行するなら小さめのWindowサイズで、フォントサイズは1.6倍
  • Windowサイズ変更に強いコードを書こう
  • ggezはAudio環境が必要
  • F*ckingWindows