0

次のイージング関数を使用して画面上のオブジェクトを移動するプロジェクトに取り組んでいます。

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ピクセルを超えてはなりません。実際、移動先の値に対して常に数ピクセルである必要があります。

4

1 に答える 1

0

私はこの質問をうまくしなかったと確信していますが、私はついに答えを見つけました。私が遭遇した問題は、時間の値が期間の値よりも大きいことが原因でした。

上記の関数では、宛先の値を入力するのではなく、現在の値と開始と宛先の差だけを入力します。私が思いついた解決策は、イージング関数の呼び出し間の実行時間がイージングの完了に許可された最大許容期間値を超えた場合、開始値を宛先値と等しくなるように設定することです。

timeは、イージング機能が開始されてからのミリ秒数です。

change=destination-currentposition
currentposition=inoutquart(time,currentposition,change,duration)
if time > duration then startarray[i]=destarray[i]

したがって、このようにして、時間が期間を超えた場合に出力値を宛先位置にクランプします。

于 2012-11-23T04:11:03.437 に答える