「初音ミク冒険記」の坂移動中のジャンプについて考えてみる
えーりんさんからコメントにあった
「クイックムーブして坂を登りながらジャンプするともの凄く飛びます」
というのについて考えてみる。
ミクの移動はベクトル計算で行っている。
上方向、左方向への移動ピクセルはマイナスとなり
下方向、右方向への移動ピクセルはプラスとなる。
通常だとミクの右への移動は、1秒間に120ピクセル。
ジャンプは、1秒間に-180ピクセルだ。
このあたりは基本的に
14歳からはじめるC言語わくわくゲームプログラミング教室Visual Studio 2008編―Windows XP/Vista対応
の内容を丸パクリしている。
試練の洞窟の2マップ目を例にすると
ミクは右に向かって進んでいくと上り坂に遭遇する。
操作としては十字キーの右を押しっぱなしで坂を上っていく。
これは図のオレンジの→のベクトルを
ピンクの角度分、回転させることで坂に沿って上っていくようにしている。
y座標だけで考える。
ここではベクトルを回転させるので上方向のベクトルが-49発生している。
ここにジャンプの上方向のベクトル-180が発生すると
y座標は(-49)+(-180)=-229となるので
通常の-180よりも高くジャンプすることになる。
同じ坂を下っていくときは
下方向のベクトルが49、ジャンプのベクトルが-180で
y座標は49+(-180)=-131となり
通常の-180よりも低くジャンプすることになる。
通常移動を1とした時、
クイックステップは2倍移動。
クイックムーブは3倍移動なので
-49が-98、-147となるから
より高く、あるいは、より低くジャンプすることになる。
ここまでは分かっていたのだが、問題は対処方法だ。
まずは上り坂を移動中か、下り坂を移動中か判定が必要そうだ。
// 傾きを反映(床の傾きに合わせて移動する)
currentVector1 = rotateVector(currentVector1, pResultLand->katamuki);
上記のロジックの結果
currentVector1.yが+1より大きければ下り坂移動中
currentVector1.yが-1より小さければ上り坂移動中
と判断すれば良さそうだ。
(pResultLandには現在いる床が格納されている)
次はジャンプのベクトル計算だ。
// プレイヤーの移動先計算
currentVector1 = VAdd( currentVector1, JUMP_MOVE);
currentVector1は床の傾きに合わせて回転済みなので
ここでベクトルの足し算を行うとジャンプしすぎになる。
currentVector1.y = JUMP_MOVE.y;
playerInfo.playerVector.y = 0;
とすれば、純粋にジャンプの分だけになりそうだ。
一応、playerVectorのy座標の慣性は切っておく。
// 接地しているときは素直にベクトル計算
playerInfo.playerVector = VAdd(playerInfo.playerVector, currentVector1);
次の問題はここだ。
ジャンプ時にplayerVectorのy座標を0にしているので
一見問題が無いように感じるのだけれど
実は接地しているかどうかの判定円が床から完全に離れるまでには
数フレーム必要なので最初のフレームでは問題なくても
2フレーム目からはplayerVectorのy座標に値が設定されているので
依然高くジャンプしすぎたりするのだ。
そこで上記のベクトル計算の後、上り坂あるいは下り坂移動中のジャンプであった場合、
playerVectorのy座標をジャンプの座標に補正してやる。
// 接地中だが、上り坂または下り坂でジャンプ中の場合
// プレイヤーベクトルのy座標を通常ジャンプのy座標にベクトル補正する
if(((debugUpSlope == 1) || (debugDownSlope == 1)) && (nowJumping == TRUE)){
playerInfo.playerVector.y = JUMP_MOVE.y;
}
これで何とかなりそうだ。
厳密には数フレーム分、補正され続けるけど
実際に動かしてみると体感できるほどでもないので良しとしよう。
2013/02/10追記
この記事の解決方法だと別の問題が発生します。
詳細は初音ミク冒険記、足場に向かってジャンプすると勝手に更にジャンプすることがある問題の解決を参照
次は、クイックムーブでの封印障壁突破対策だな。
| 【固定リンク】 | 【コメント (0)】 | 【トラックバック (0)】
このエントリーへのリンク
トラックバック
この記事へのトラックバックの一覧です: 「初音ミク冒険記」の坂移動中のジャンプについて考えてみる:
コメント
このブログの新着コメントをRSSリーダに登録する為のxml