「Processingで世界一のflappy bird風クソゲーをつくりたい」「作るってどのレベルで?物理シミュレータから?」

f:id:karaage:20210902205345p:plain

クソゲーを作りたい!

 最近、iPhoneでとびなっしーといういわゆるFlappy Bird系のゲームをしています(公開終了しています)。

 これがまたよい意味でクソゲー、単純なのに結構難しくて何故か辞められない、これぞクソゲー!そんなクソゲーを自分もつくりたい!

「Processingで世界一のflappy bird風クソゲーをつくりたい」
「作るってどのレベルで?物理シミュレータから?」
(出典 TOKIO「どのレベルから作るの?」まとめ - Togetter)

 というわけで物理シミュレータからクソゲーを作ってみました。

flappy bird風クソゲー

 とりあえず結果から、作ったクソゲーです。

遊び方:タイミングよくクリックして障害物を避けましょう。それだけです。ちなみに私の最高スコアは22程度です。我こそはというスコアとったらコメントとかして教えて下さい。

物理シミュレータ

 最近は空前の物理シミュレータライブラリブームです(本当か?)。有名なのはUnityでしょうか。手軽に3Dゲームソフトが作れるということで大人気です。こういったライブラリで手軽に今時のシャレオツ(死語)なゲームをつくるのもよいのですが、やっぱりそういった枠にハマったクソゲーは所詮おしゃれなクソゲーです。やはり物理シミュレータの原理を知り、シミュレータレベルでクソゲーをつくりましょう。

 というわけで、ここからじっくりと高校の物理レベルで理解できるよう、オイラー法から始まって、4次のルンゲクッタ法と説明していこうと思っていました。思っていたのですが、すみません挫折しました。原因は、私が人に教えられる程ちゃんと理解できていないことに気づいたのと、あまりに面倒くさかったからです。ごめんなさい。

 要は何が言いたかったかと言うと、オイラー法は簡単で単純なゲームくらいには十分なのですが、やっぱり江戸っ子なら(私は江戸っ子じゃないけど)、もうちょっと精度にこだわりたいよね。4次のルンゲクッタだと4次まで計算するので結構精度でるよ。でも結構計算に時間かかるから計算に不向きじゃんね。そこで速度ベルレ法ですよ!!

 速度ベルレ法というのは分子シミュレーションとかに使われる計算手法で、計算が速い上に精度もそこそこ出て発散もしにくいという、なかなかよい感じの特性を持っています。分子シミュレーションは膨大な数の分子の相互間力を計算するため、計算コストが低くて精度がある速度ベルレ法みたいな手法が最適なのですね。
 ゲームも複雑な物理ゲームだと、大量の計算を発散せず実行することが必要とされるので、ゲームに応用するとよいのじゃないかなと思ったわけです。実際結構取り入れられたり、似たような計算しているんじゃないかなと勝手に思っています。詳しい人いたら教えて下さい。

 速度ベルレ法ですが、式にすると以下となります。

{ \displaystyle
v'(t + \Delta t) = v(t) + \frac{\Delta t}{2}F(t)\\
r(t + \Delta t) = r(t) + \Delta t v'(t+ \Delta t)\\
v(t + \Delta t) = v'(t + \Delta t) + \frac{\Delta t}{2}F(t + \Delta t)
}

 これだけだとあんまりなので、参考リンクは以下となります。もっと知りたい人は速度ベルレ法でgoogleで検索してみて下さいね☆

数値積分の実行
分子動力学の研究(pdf)

 プログラムの実装例は、私の汚いソースコードでも参考にしてみて下さい。92行目当たりが速度ベルレ法での計算です。

140608_KusoPhysicalGame - OpenProcessing

 あとは、障害物の動きとか、当たり判定とかについても解説していこうと思ったのですが、やっぱり面倒くさいので省略します。汚いソースコードを読んで、空気とか色々読んでみて下さい。

今後の予定

 絵とか音楽とかつけてもうちょっとゲームっぽくする予定でした、予定でしたが初回からこの調子ですので予定は未定です。あんまり期待しないで下さい。

参考リンク

はてなブログの LaTeX 数式表示がデフォルトで MathJax 化された - 余白の書きなぐり
 はてなブログでtexで数式かけるの初めて知りました。