トロッコのジャンプについて ~饅頭の慣性がいい感じになった話~
ゆっくりマインカート解説記事 二回目。
今回はトロッコのジャンプ処理についてです。
GameMakerのプログラム的な話が続くので興味のある方だけどうぞ!
プレイ画面へはこちらから!
ゆっくりマインカート(ニコニコアツマール)
ゆっくりマインカートの記事のまとめはこちら
ゆっくりマインカートまとめページ(Cien)
ジャンプの前提
トロッコのジャンプは以下の条件で作っています。
- レールの上にいるときだけジャンプ可能になる
- ジャンプボタン入力でジャンプする
- ジャンプボタンを離すと落下を開始する
- ジャンプ後一定時間経過でも落下をする
- 落下の軌道をスムーズにする
トロッコのジャンプ
最終的にこんな処理になりました。
一定時間で落下するだけなら物理公式をそのまま使えてたんですが、
ジャンプボタンを離すまで落下しないと
ボタンを押し続けても一定時間でスムーズに落下する
というルールを両立させたせいででだいぶ苦労した記憶があります。
if(canJump)
{//ジャンプできる状態
if(_JumpKeyPressed)
{//ジャンプキー入力
canJump=false; //ジャンプ可能フラグを消す
jumping=true; //ジャンプ中フラグを立てる
vspeed=jumpSpeed; //上方向に速度を付ける
//alarmが起動するとjumpingフラグが折れるようにする
alarm[0]=jumpTime;
}
}
else if(jumping)
{//ジャンプで上昇中の状態
vspeed+=0.5; //少しずつジャンプスピードを下げる
if(_JumpKeyReleased)
{//ジャンプキーを離すと落下する
jumping=false; //ジャンプ中フラグを折る
alarm[0]=-1; //alarmを強○的に終了させる
}
}
else
{//落下中の状態
//落下最大速度になるまで加速させる
if(vspeed<fallSpeedMax) vspeed+=0.5;
//落下(vspeed<0)するまでは急いでvspeedの値を減らす
if(vspeed<0) vspeed+=2;
}
ゆっくり霊夢の挙動
ゆっくりに慣性が欲しかった
トロッコは移動や操作を担当するトロッコ本体と
アイテムとの当たり判定を担当するゆっくり霊夢の
2つのオブジェクトにわけてつくっています。
2つに分けることによってジャンプ時にゆっくり霊夢がトロッコから浮く
という処理を実装しやすいかなと考えてもいました。
こういうのを作りたかった。
最初はトロッコのyの履歴を記録していって、
ゆっくり霊夢は履歴を遡ってyを取得することを考えていたんですが
最終的にイベントのBegin/Endを使うことで簡単に実装できました!
具体的な流れはこんな感じです
1フレームの処理順
- 1.ゆっくり霊夢のBegin Stepイベント
- 自身のyにトロッコのyを代入する
- 2.トロッコのStepイベント
- レールとの当たり判定やジャンプの制御
- 3.StepとEnd Stepの間
- vspeedとhspeedによってトロッコが移動するタイミング
(1.で取得したyは1フレーム前のyになる)
- vspeedとhspeedによってトロッコが移動するタイミング
- 4.ゆっくり霊夢のEnd Stepイベント
- 自身のxにトロッコのxを代入する
(ここで取得したxはトロッコと一致)
- 自身のxにトロッコのxを代入する
- 5.オブジェクトの描写→次フレームへ
感想
ジャンプって難しいと感じた処理でした。
他の人はどんなプログラムを書いているのか気になります。
学びが足りない...
あとは、ステップのタイミングをずらすことで
ゆっくり霊夢の慣性と自然なジャンプを表現できたのは良かったです。
最初はトロッコの高さ履歴を取るかとか考えてめんどくさかったので、
かなり嬉しい発見でした。