次のイージング関数を使用して画面上のオブジェクトを移動するプロジェクトに取り組んでいます。
function easeinoutquart(t,b,c,d) as float
't=time, b=startvalue, c=change in value, d=duration
d=d/2
t=t/d
if (t < 1) then
return c/2*t*t*t*t + b
end if
t=t-2
return -c/2 * (t*t*t*t - 2) + b
end function
値が急速に範囲外になり、オブジェクトが目まぐるしい速度で画面外に移動する状況に遭遇し続けます。最初の状況は、関数の結果を整数値に切り捨てることによって引き起こされたようですが、これを修正しました。まったく同じ動作を引き起こした次のことは、オブジェクトが静止し、新しいイージング距離が入力された後、時間値がリセットされなかったときであるように見えました。宛先値を変更した後にリセットを追加すると(change = destination-start)、これで問題が完全に修正されたようです。
これで、画像をダウンロードして交換するループにコードを追加しました。ループに実行時間が追加されると、値が範囲外になり、画面から飛び出す画像の同じぼやけが生じることがあるようです。
コードを簡単に説明するには:
loop
check for user input (up down left right select)
if so set new dest position for all images, reset timer for all images
if a new image is selected on screen, load related content, reset related content timer
is there an image in the queue to download? if so get initiate async download
are any images downloaded? If so swap out temp image with final image
call easing function for primary images (vertical movement on y axis)
call easing function for related content (horizontal movement on x axis)
draw all graphics and swap display buffer
end loop
イメージのダウンロード/スワップ(実際のスワップはポインターを変更するだけです)コードを追加する前は、プリロードされたイメージと一時的なイメージの両方ですべてがうまく機能していました。最初に一時画像を読み込んでスワッピングしているので、ループが1/30秒以上で実行されることがあり、これがタイマー値の異常を引き起こしている可能性があります。
したがって、基本的に、イージング関数が急速に制御不能になるクレイジーな値を生成しないようにする値を設定できる、ある種の「ガバナー」クランプがあるかどうか疑問に思っています。たとえば、移動した合計距離は、1回の反復で250ピクセルを超えてはなりません。実際、移動先の値に対して常に数ピクセルである必要があります。