この手のゲームのキモといえる、ジャンプについて考える。
サンプルプログラムは、スペースキーを押したら、ジャンプする高さは一定。ジャンプ中も左右の入力によって移動できる。
使っているのは、es_gravity命令での重力設定と、ジャンプしたときにY移動値を設定すること。
まずはこれをベースにジャンプさせてみる。
es_gravity命令で設定できる重力は、XとY座標系で指定でき、値のプラスマイナスで方向が変わる。
これで、上下左右に重力のかかる方向を決められる。
また、値の基準があって、256を設定すると、1フレームあたり、1ドットの加速度になる。
ジャンプさせるには、es_apos命令など、自動移動する命令を使えばよいのだが、サンプルプログラムでは、直接es_setp命令を使って、Y移動値を設定していた。
jump=-10 es_setp 0,ESI_SPDY,jump<<16
これをstick命令でZキーを押したときに実行する。ただ、ちゃんと床にいるときであることを判定しないと、空中でジャンプし放題になるw
移動した後のマップとの接触判定は、es_get命令で、ESI_MOVERESの値を取得して参照できるようだ。
取得した値にESSPRES_GROUNDが含まれていれば、床に着地している状態と判定できる。
jump=-10 stick key if key&2048 { ;ジャンプ処理 if myres&ESSPRES_GROUND { ; 着地しているかチェック es_setp 0,ESI_SPDY,jump<<16 ; Y移動値のみを設定 } }
これでZキーを押すとジャンプして、重力があるので、自然に着地する。
ここまでは簡単だったのだが、ゲームの味付けとしてジャンプといえば、某N社のMさんのジャンプ挙動がしっくりくる。
一番影響するのは、重力の値。基準値の256にすると、ジャンプも落下もちょっと早く感じる。
そこで、設定値を半分の128にしてみる。
単純に1/2の重力になったことになる。ジャンプさせると、ふんわりジャンプになるけど、その分、高く飛び上がる。
次に影響するのは、ジャンプ力。Y移動値に設定する値を小さく(マイナス方向が上なので)すれば、高く飛び上がる。
この二つの値をうまく決めて調整していこう。
本当はボタンを押した長さで、ジャンプの高さを調整できるようにしようと思ったが、es_gravity命令の重力下にあるスプライトに対して、加速度を可変させると、二段ジャンプしているような不自然なものになってしまった。
いったん割り切って、小ジャンプ、大ジャンプのボタンを作って、ゲームの本編となる部分を作っていこう。