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 秒的时间内执行,这可能导致计时器值变得奇怪。

所以本质上,我想知道是否有某种“调节器”钳位可以放在值上,以防止缓动函数产生快速失控的疯狂值。例如,在单次迭代中移动的总距离不应超过 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 回答