プレイヤーキャラクターがdo7beのアイコンにもなっているInnocent HeartをRustで移植した。
下記URLにてブラウザ上で遊べる。
https://do7be.github.io/innocent_heart/
昔話と移植した背景
作成した当時は18歳で、OpenGLを用いてゲームを作るという学校の課題のものだった。
ゲームを作るのが楽しすぎてめちゃくちゃ時間かけて作った記憶がある。
実はまだオリジナルのコードは残っていて、コンパイルして遊ぶことができる。macOSで動作確認済み。
https://github.com/do7be/innocent_heart/tree/c
しかしコンパイルするためにglpngというライブラリが必要なのだが、glpngは現在リンク切れを起こしており入手が難しい。
Dockerで動かそうにも、macOSでX Window SystemでGUIを動かすソフトウェアが使えると思ったのだが、去年辺りからOSアップデートで動かなくなった模様。
そのため、面倒だが最近習得したRustに移植してみようと思った。
Rustの話
そもそも現在メンテナンスされているものがあまりなく、選択肢として2つくらいしかなかった。Bevyも1.0.0になっていないので悩みどころではあった。
ただ、色々調べていくうちにわかったが、結局フルスクラッチのような形になり大変だった。
コード量は倍くらいになった。まあ元のコードが相当圧縮された書き方だったのもあるけど。
Componentという概念がとっつきにくくて難しいが(Unityにもあるやつだと思えばそう難しくはない)、ライフタイムを意識しなくても良いのでその点ではかなり書きやすかった。
ゲームはだいたいスパゲッティになるのでゲームエンジンの書き方に則れば結構きれいに書けて助かった。まあ最後の方はもう早く終わってくれという気持ちでめちゃくちゃに書いてしまったが…。
https://github.com/do7be/innocent_heart
ちなみにWebAssemblyにコンパイルしたものをGitHub Pagesで公開しているが、普通にローカルでコンパイルして実行することもできる。クロスプラットフォーム素晴らしい。
おわりに
まあなんにせよ、「昔このアイコンのキャラが主人公のゲームがあって…まあ今は遊べないんですが」みたいなやりとりをしていたのが嫌だったので、これで「このゲームのキャラです」と言えるようになったのがうれしい。
昔のバージョンよりめちゃ早くなっていてむずいんだが、まあ遊んでみてほしい(昔はマシンパワーに比例したスピードだった。今回60FPSにしたのでバランス調整はしているものの割りと早い)