2Dアクション・テンプレート:プレイヤーの作成

=概要=

「プレイヤーの作成」といっても、ここでやっていることは単純で、基本は「地形ブロック」をベースに「入力によって動く」という処理を追加しただけ。ただ、気をつけるべき点がいくつかあるので、ここではそれらについて書く。

=スリープのオフ=


物理エンジンのスリープ機能をオンにしているため、設置した状態で放置していると、コリジョンに速度をセットしても動かなくなる。毎回「WakeUp」で起こしてもいいが、ここでは最初から「AllowSleeping(false)」とすることで、スリープの対象から外すようにしている。

=固定・移動の切り替え=


床のコリジョンは固定で、プレイヤーのコリジョンは移動可能。これを切り替える手っ取り早い方法は「mass(質量)」を「0:固定」と「実際のもの:移動可能」で切り替えること。なので、ここでは「初期状態:質量を計算せずに0にする=固定」「切り替え時に、質量を計算したり0にしたりする」という方式で対応。

=慣性まで考慮した移動速度設定=


コリジョンに速度を設定するのは「SetLinearVelocity」で可能。入力に応じて速度を設定するだけで、あとは勝手に動いてくれる。


現在の仕様は上記の通りだが、将来的には慣性を考慮したものに変更したい。
直接値をセットしてしまうと、ブロックに乗っている状態での左右移動がおかしくなる。例えば、ブロックが「時速100km」で移動している時に、その上のプレイヤーが「時速10km」で移動する場合、プレイヤーは「時速90km(or 時速110km)」で移動しているように見えなければならない。なので、「直接値をセット」ではなく「値を加算」という方法が必要になるが、毎回加算し続けると時速が上がり続けたりする。そのため、「ブロックの速度」をなんとかして取得して、それに加算する形で対応する必要がある。
オワタの時はこの方法で対応していたが、今回は時間の都合でひとまず単純なものになっている。


=接地判定=


ジャンプまわりで必要になるのが「接地判定」。
例えば、「空中に居る時」は(2段ジャンプなどはひとまずおいといて)ジャンプできないようにしたい。そのためには、「現在、地面に接しているか?」という判定が必要になる。プレイヤーの下にブロックが接していれば「地面に接している」と言える。坂に乗ってる場合も同様だろう。しかし、坂の角度がだんだん高くなり、最終的に壁のように垂直になった場合、そのブロックに接していても「地面に接している」とは言えない。そのため、「ブロックとどの角度で接しているか」という方法で判定しなければならない。


Box2Dでは、接触中に毎回関数(Persist)を呼んでもらうようにすることが可能。この関数に渡される引数には「normal(法線)」として「どの向きで接しているか」という情報(ベクトル)が渡される。ベクトルの角度をいちいち計算してもいいが、単純にこのベクトルのY座標を見れば「どの程度上を向いてるか(どの程度平坦か)」の判定はできるので、ここではY座標だけを見ている。




以上で基本的な説明はだいたい終わったものの、まだ「配列によるステージ作成」が残っているので、次回はそれをやる予定。