まずは動画アップロードテスト。


マリオカートではよく重量級キャラクターが強いといわれる。
なぜ強いかといえば、ハイパワーなエンジンと衝突時の安定性が主な理由なようだ。
オンライン対戦でもよく見かけるのはクッパやモートン、ロゼッタやメタル勢。
私の場合はとりあえずマリオやヨッシーで挑んでいるものの、勝率は芳しくない。
ゲームに限らない話だが、個性にこだわって環境に逆らい、結果として負けがこんで
しまうようであればやり方を少しあらためた方がいいのかもしれない。

最近も自作プログラムでの当たり判定(コリジョン)の処理を進めていたのだが、
そろそろ「重さ」のステータスをキャラクターに入れた方がいいかもしれないと考えている。
これはなぜかというと、キャラクター同士が衝突したときの処理として、キャラクターの
はじき方向まで指定する必要が出てきたからだ。

今までのキャラクターの衝突は
「衝突を検出した時刻(よりわずかに前の時刻)で両者の移動を停止させる」
というシンプルな処理としていたが、どうしてもこれだけでは処理しきれないことがわかってきた。

ss_20140630a2

特に問題になるのはジャンプ中だ。
前方ジャンプ中の上昇中に敵キャラクターに当たった場合、2Dゲームならそのまますりぬけて
しまえばいいし、敵に当たる=ダメージ として扱う3Dゲームならモーションを空中ダウンに
切り替えればいい。
しかしそれ以外の対戦ゲームなどでジャンプ移動を単純にキャンセルしてしまうと空中停止に
なってしまう。「衝突=停止」として処理を扱っていると、「キャラクターに向けてレバーを
入れていればずっと空中停止していられる」という妙なことになってしまう。
ジャンプ落下だとさらに深刻だ。 ジャンプで相手キャラクターの真上に乗っかって
停止してしまうと自分の移動操作を受け付けず、相手も移動できない状態になってしまう。
これはどうあってもまずい。 「衝突=停止」だけでは成り立たないことを痛感するようになる。

解決法としては、マリオだ。ノコノコのこうらを踏んだ後の上昇のように、跳ね返りの運動があれば、
相手が消滅していなくても次の瞬間にいまと全く同じ衝突が起きて操作不能になるような事態は
回避できる。 結局は物理的なボール運動にならうということだろう。

――そんなこんなで、衝突直後の反射成分の計算が必要になってきた。
ボール運動ということは、反射の方向や初速を計算するために衝突状況のログをとったり
キャラクターに質量を与えたり、摩擦係数などを設定するという物理方面の勉強と再び
向き合うことになるだろう。

物理法則にしたがった動きを厳密に守るつもりは毛頭ないのだが、これの簡易テスト版を実装したところ、
キャラクター衝突で相手を押す、衝突時にお互いが少しずれながら移動する、といった製品の
ゲームでよく見かける動きに近づき始めた。 どうやら取り組む意味はありそうだ。

ss_20140630a1

このあたりの処理が終われば、またしばらくは数学から離れられるはず…
ゲームらしい製作に移るにはまだ道のりがありそうだが、もう少しだけ頑張ってみよう。