ブログ内検索

2019年9月1日日曜日

11-12 リザルト画面りんご反映

卯木はいよいよリザルト画面のりんご設置に移る。
すでにフラグはまとめて取得済みなので、ちょっと触るだけでよい。とっても数十分はかかるが。そして以下のようにGETしたりんごはリザルトに出る。


さてここからりんごをステップへと吹っ飛ばす処理を行う。
本家を見てみると、開始点での微分係数0からたぶん60フレームくらいかけて目的の場所に移動すると思われる。

というわけで、ここでは60フレーム、という部分を後からでも修正できるように変数Tとしておき、1フレーム目からTフレームまでの位置を返す関数R^1→R^2を定義するで。

まずはt=0で開始地点が(a,b)であるとして、t=Tで終了地点が(c,d)であったとする。
これも変数として与える。そうすれば後で座標を指定すれば一挙にチュピーンや。

まず、放物運動であるという仮定より、x軸方向の移動速度は一定。
したがって、c-aというx軸方向の距離を時間Tかけて移動するので、時刻tにおけるx座標はa+(c-a)t/Tと直ちに求まる。
次にy座標を求める。
はじめはbであり、時刻Tにおいてdとなる。
ここで、微分係数が0だったので、当然ながらy軸方向の初速は0。
ということは物理のあれを用いると、普通にb+A(t/T)^2がベースとなる。
なぜこれかというと、t=0でbの値を取り、t=Tでb+Aの値をとる。ここでA=d-bと定めてやると、ちゃんとt=Tでdという値になる。ここは数学的ではなく物理的な法則に注目しての話であることに注意。
というわけで、座標は(a+(c-a)t/T,b+(d-b)(t/T)^2)と与えられる。
試しにt=0をぶち込むと、(a,b)となり、t=Tを代入すると(c,d)となる。
なお中間の時刻t=T/2において、座標は((a+c)/2,(b+3d)/4)の値となる。

さてこれをウディタで表現するわけだが、毎度のごとく小数点以下は切り捨てとなるため、例えばT=60などとするとt=1だと(1/60)^2とかで有無を言わさず0。もっというなら、t=59まで0の値をとる。これでは話にならん。
そこで、tを100tあたりに拡張する。こうすることで、t=1の時点でも切り捨てによる問題が少なくなる。あと、2乗は先にばらしてt^2/T^2とするほうが吉。

これをウディタに打ち込む。
上記のように移動する。これは今のところテストのため、全部移動先を座標を右上にしている。そのため、各リンゴのx座標が等しければ開始と終了のx座標も当然等しいので、これ2つしか引数にもたないx座標は一定なのは当たり前。
この後は当然、各りんごが何個目のステップに入っていくのかを定義する。

これも簡単で、現在の個数を読み取っておくとよい。具体的にはワンダーステップの内部値格納用の変数14個をつくる。なぜ14個かというと、たしかアニマロッタは7個以上たまれば一応余ったものがストックされているという仕様のため。
さすがに15個以上りんごが集まるのはないため、それ以後もたまるかは我は知らん。
ただそんなことはほぼないので、とりあえず14個まえはたまり、それ以外は新しいものは廃棄、という処理でいくことにする。
順番にこの変数14個に内部値を代入して、内部値の代入が0でない場所を順次りんごの行先として同時に変数に内部値を代入。後で一気にやると当然ながら全部最初のところと同じ位置に入り込むため。
ただし、途中で7個を超えた場合は、7で割った剰余をその順番として、変数は普通に7個以降のところに代入するというだけの話。

これができれば、いよいよワンダーステップが機能することになる。

そうなれば、ついにワンダーチャンスというものが発生する。
ここまで長かったわ…途中1か月くらいは飽きていたので実質3か月くらいで作ったことになる。