Processingにおけるオブジェクトがジャンプする挙動の再現
学校の授業でprocessingについて扱ったのですが、そこで私はマリオを再現しました。そのツイートを宣伝として貼っておきます。
https://twitter.com/syunki____/status/1269528018076102657?s=20
さて、今回はその中で考えたジャンプの挙動について紹介しようと思います。
まず、マリオの高さをどうやって描いているかですが、基本的には高校物理の力学公式である
y=1/2gt^2+vt+y0
を応用しています。yは高さの座標、tは時間、vは初速、y0は初期位相を表しています。マリオの高さはこの式だけで表現しています。ですがこれだけではうまくいかなかったため、マリオが地面の高さにいるとき、この式の中のgを0にしていました。それ以外の高さにいるときにgを適切な定数(この値によって挙動が現実に近くなるかそれとも宇宙のようにゆっくり動くかを決めることができます)に設定することで重力を再現できます。こうしておくことで例えば段から落ちることなど何らかの原因でマリオが空中に放り出されたとしてもきれいに落下してくれます。
次にジャンプの仕組みですが。何らかの形(私はマウスの右クリック)でジャンプの入力がなされたとき、その高さをy0に保存します。そして初速vに値を与えます。言い忘れていましたがマリオがジャンプするときだけこのvには値を入れるようにします。ですから再び地面に戻ってきたらvは0に戻します。また、ジャンプが入力された瞬間にtもカウントし始めます。これも地面に戻れば0に戻します。これだけで基本的にはジャンプの機構が完成します。
次にyをint型にするかfloat型にするかという問題ですが、私はできるだけスムーズな描写を求めてしまったためfloat型にしました。ですがその弊害として着地するときに地面を突き破るバグが多発しました。その時はy座標が地面より大きくなったら地面の高さに強制的に戻すという式を組み込んでいれば解決できます。ですがこの方式はもっと複雑な地形になったりした場合応用を利かせにくい、バグが起きやすいと考えているのでもっといい方法があればぜひお聞かせください。