なにこの暑さはふざけてんの。室温31℃であちーと思ったら外も30℃あったり。外が涼しくなってきても台風で窓開けられなかったり。
タイトル画面ができました!
ゲーム画面本体は変わってないので省略。 ふざけてんのかと言われても全く言い訳できないレベルの進捗でした。
でもシーン遷移って大事なんよ。あとから入れようとするとめんどいことになるんで先に考えておかないとだめなんよ。 ゲーム作る時は、本編を作り込む前に全体を通せるようにしといた方が無難だよ!
左上にパフォーマンスモニタ的な表示は出せるようにしたところ、行列演算がとても重いことがわかった。予想はしていたが想像以上に重かった。 もうちょいなんとかならないか検討してはみたが、Rubyレベルでは多少改善はできても劇的な改善は無理だろう。まあそのうちC#で書くよ。
パフォーマンスモニタを作るにあたって普通にTime.nowを使ってたんだが、IronRuby+.NET4だとどうも16ms程度しか精度がなさそうだったので.NETのSystem.Diagnostics.Stopwatchを使うことに。当然ながらこいつはもっと精度出てくれた。本当にどこまで出るのかはわからんところだが、少なくとも1msは出てるのでいいだろう。
さてあとはゲーム本体をちゃんと作り始めたい。が、楽しい衝突検出の時間である。泣きたくなる。 よく考えたら斜めSTG的な見た目で、どうせなら高さ概念入れたいと思ったので2Dでなく3Dの衝突検出が必要であった!死にたくなる。
衝突検出を作るにあたっていくつか方法が考えられる。
物理エンジンを連呼しているがべつに物理シミュレーションをやりたいわけじゃない。しかし衝突検出だけのライブラリなんかがぽろっと落ちてることはないだろうと思う。一方で物理エンジンは衝突検出が肝なので、物理エンジンを持ってくれば衝突検出が作り込まれてることは間違いないわけだ。
既にあるなら使えばいいじゃんと思うものの、今書いてるのはRubyである。しかもターゲットはIronRubyとJRuby。つまり.NETとmonoとJVM。 それらでなるべく共通して使える物をと思うとほんと難しいんだよね。
どっかの物理エンジンをそのまま使おうにも、IronRubyとJRubyから共通にそのまま使える物なんてないわ。さすがにPureRuby製の物理エンジンなんて無謀な物は見つからなかった。dllにできる物ならffiとか使ってバインドしちゃってもいいが、IronRubyにはまだffiが無いので一旦C#でバインダを作る必要はあるだろう。それよりめんどいのはネイティブにコンパイルされるとプラットフォーム毎にそのライブラリをビルドしないといけないことなんだよねぇ。
一応3Dの物理エンジンだとNewton Game Dynamicsてのがみつけられた。これはCレベルのインターフェースがあるっぽいのでたぶんdllにもできるだろう。.NETのバインディングというのもあったがC++/CLIなのでMonoでは使えない。Bulletなんかも有名だがこれはC++なのでdllにして使うのはめんどそう。
2Dの物理エンジンではChipmunkてのがあった。Cで書かれてるのでdll化は当然可能。これはRubyのバインディングもあるがCRuby用だ。どうもffiを使ったバインディングもあるようなので、それはJRubyでは動くんじゃないかと思う。2Dで有名なBox2DはC++なのでやっぱりdll化はめんどくさそう。
移植というのは物理エンジン自体をRubyで書き直してしまう話。結局一番マルチプラットフォームなのってPureRubyコードでそ?!という物なんだが……。これは大変面倒なうえにやる前から絶対遅いというのが分かっていてつらい。どう考えてもやばい道である。まあ遅いのは分かってるのでそのあと結局C#とかJavaとかで書き直すんだけどね……という話になるとまた大変だ。これやるならバインディング書くわ。
自前で書くのはさらに大変な話……ではあるが、移植よりはいらない部分を省けるので楽かも。というのも欲しいのは衝突検出エンジンであって、そのあとの剛体物理演算部分はいらないのだ。まああって悪い話ではないがすぐ必要になる気もしないし。でも3Dの衝突検出というと死にたくなるレベルでめんどい。
とりあえず自分で作れるものかどうか自信もないので、最近出た本を思い出して買ってきた。ゲーム制作者のための物理シミュレーション 剛体編てやつ。買っただけじゃなくてちゃんと読んだよ。めずらしく。
結果、自分で作ってみることにした。2Dの衝突検出部分をね。
3Dじゃないのは、よく考えたら2D+高さだけで充分だったため。ゲーム的に高さ方向に複雑な処理はいらないと思われる。
作ることにしたのは、本読んだら2Dの物なら比較的簡単に作れそうだったため。てか読むと作りたくなるような本だったのだ。
しかし本読んだだけでは微妙だったのでBox2Dも参考にして衝突判定部分を作ろうと思う。まあ移植してもいいんですけどね。気が向いたら移植するかもしんないけどな。
上にも書いたけど、ゲーム作るのに衝突検出が必要だったのでゲーム制作者のための物理シミュレーション 剛体編を買ってきて読んだので感想など。4000円+税とまあまあの値段だがヨドバシのポイントで全額払った。ポイントは本を買うためにあるものです。
結論から書くといい本だった。これ読むだけでリアルタイムの物理シミュレーションエンジンが作れるかっつーと厳しいだろうが、作ってみたいとか作れそうな気がする本である。
俺の知識は、物理エンジンはちょっと使ったことがあって、衝突検出は2Dのを作って死にそうになって、ゲームプログラミングのためのリアルタイム衝突判定という本を途中まで読んだけど難しくて死にたくなったレベルです。
最初から行くと、タイトルはわかりやすいけど、ゲーム制作者のための~とか付くとちょっと安っぽい。べつにいけど。あと装丁も安っぽく見える。べつにいいけど。
第一部の歴史編は全く内容が無いというか、まあ全然意味ない。あまり深い話もなく最近のこんなゲームに物理が使われてるよー程度である。でもこれはべつにこれでよくて、さらっと適当な読み物として読むには良い感じで、いきなり理論編から入られたらしんどくなりそうなところを柔らげてくれている。気楽に読めるのでいいですね。
第二部の理論編から本編。数式がいっぱい出てくるけどべつに数式は読まなくてもいい気がする。教科書的な本だと物理について理論的なところからしっかり説明しそうなものだが、この本ではゲーム向けなのでと近似しまくり。そんなに近似しちゃっていいもんなんだ……と感動&とても参考になります。ソート手法とかも軽くだがわかりやすく書いてあるので、いきなり知らん単語が出てきて何のこっちゃとなる部分(というかイメージできない部分)が少ないのも素敵だった。
だいたいの部分が2Dについて書いてから3Dに拡張するって形で書かれているのでイメージもしやすい。2Dの物理エンジン程度ならこれ読んだだけで作れそうな気がしてくる。
第三部は実装編。サンプルの物理エンジンがあるということなのでその解説に終始するのかと思ったらソースは全然出てこない。ちょっと出てくるけど疑似コードと言うくらいに省略されまくったものだった。じゃあ何が書いてあるのかというと、理論編で説明されたものをさらにはしょる話。これ以上はしょっちゃうんですか!というくらい簡略化しまくる。すげー。これでいいんだ……。
もちろん最終的な物は機能少なめなんですが、でもちゃんとそれなりに動く物になっててすげーなーと。いやこれなら確かに作れそう、というところに落ち着いてんのがすごい。欲しい物をあれもこれも入れた物理エンジンは確かに便利だろうけどそう簡単に作れる気しないだろうしなぁ。
あと最後に物理エンジンを使うにあたってのTips的なものが書かれてて終わり。Tipsは慣性テンソルをちゃんと理解して設定すると思い通りに動かせるよ!という話だけどやっぱりいざとなったらわかんねーと思います。
参考文献はちょっと少なめな気もするかな。もうちょいこの先に進むための指針があると嬉しかった。
完全に期待をよい方向に裏切られた本だった。とても難しいかソースがだらだらっと載ってはい終わりな糞本かどっちかだろうなーと思っていたんだが、どっちでもなく本当に実践向きの本。正直言って今時フリーでいい物がころがってる物理エンジンを自前で作る意味なんてさっぱりわからねーが、それでも作ってみたいと思わせられた。
あと自前で作らないにしろ物理エンジンを使うだけでも理論編の知識は知っておいた方がいいと思う。使うだけでもImpulseがどうこうという値があったときにこれに何を設定するとどう動くものなのやら……という知識は必要になるんで。それくらいならこの本はいらないが、やはり物理エンジンのドキュメントなんかを見ていくと、ブロードフェイズとナローフェイズがどうこうとか、キャッシュがどうこうといったちょっくら実装を知らんとわからん言葉も出てくるので、やっぱり知識だけでもあるとすんなりと使えると思う。
ところでタイトルには剛体編とかあるけど、流体編とか軟体(?)編とか続くんですかね。続かないと思うけど。