ゲーム作成 アドベントカレンダー 6日目「長押しによる大ジャンプ」
まず、本日の成果物です。お収めください。
スペースキーでジャンプです。
5日目時点のジャンプのバグ取ったのと、軽く押したときの小ジャンプ、長押しによる大ジャンプ機能です。
長押しによるハイジャンプ
これ誰かちゃんと記事書いたことあるのか・・・?
物理学の式としては、高校物理で習ったから簡単なのよ。
$${y=−\frac{1}{2}gt^2+v_0t}$$
でも、この式って長押しによるハイジャンプと相性悪いんですわ。
現実のジャンプは、$${v_0}$$ がジャンプを踏み切った瞬間の初速度を表していていて、重力でだんだん減速して落下に転じるわけだ。要するに初速が上昇速度で最大になる。
で、長押しって、瞬間の概念じゃないので、長押しかどうかを判定するタイミングですでに空中に飛び出してるので、空中にいる段階で追加の速度を与える必要がある。これって空中で加速するように見えるんですよね。これが不自然なんだわ。そして加速して見えないほど小さくすると、ハイジャンプとジャンプの高さがあまり変わらないので意味がない。
ぶっちゃけ、加速して見せて良い2段ジャンプの方が簡単です。
というわけで、実際の物理学は使用せず雰囲気を合わせていく方法を取っています。
enum JumperState {
Idle,
StartJumping,
ShortJumping,
HighJumping,
Falling,
}
public void Jump() {
if(state == JumperState.Idle){
state = JumperState.StartJumping;
nextStatusCount = 12;
velocity = 0.09f;
gravity = 0.003f;
}
}
public void ReleaseJump() {
if(state == JumperState.StartJumping) {
state = JumperState.ShortJumping;
}
}
void Update()
{
if(state == JumperState.StartJumping && nextStatusCount <= 0) {
state = JumperState.HighJumping;
nextStatusCount = 24;
velocity += 0.03f;
gravity = 0.0015f;
}
if((state == JumperState.ShortJumping || state == JumperState.HighJumping) && nextStatusCount <= 0) {
state = JumperState.Falling;
gravity = 0.005f;
}
velocity -= gravity;
Altitude += velocity;
if (Altitude <= groundAltitude) {
Altitude = groundAltitude;
velocity = 0.0f;
state = JumperState.Idle;
}
if(nextStatusCount > 0){
nextStatusCount--;
}
}
ざっくりジャンプボタンを押して 12カウント(0.72秒ほど)もボタンが押されていたら、ハイジャンプ、そうでなければ通常のジャンプとして扱っています。
ジャンプとハイジャンプのつなぎ目を目立たなくするために、重力弱めたりしています。また、落下時の重力をアップしています。
これは調整で時間溶ける・・・!
つなぎめ
1度見たときは加速を感じるんだけど、2度、3度みていくと加速が見えなくなります。これ、いわゆる移動物をみるときに起きる錯覚で、認識はカンマ数秒、現実より遅れていて、移動の途中を勝手に想定で補正してくれているんだと思います。
そういう人間の感覚も影響してくるっぽいです。