1

我需要在父 MovieClip 中对元素进行无休止的水平滚动。

无论我尝试什么方法,都会出现“漂移”元素,最终元素开始重叠。

我已经尝试根据每个元素使用相对递归补间,但是这种方法在重复启动和停止后似乎容易出现相当多的错误。

//CODE START
      function doScroll():void {
         TweenLite.to(this, .25, {x:"20", ease:Linear.easeNone,onUpdate:checkPos,onComplete:doScroll});
     }
//CODE END

我已经恢复到使用恒定速度对预定义位置进行绝对补间。这似乎更准确,但仍然会出现一些“漂移”。

//CODE START
//_dest is predefined 
var speed:Number = 500;
var dist:Number = this.x - _dest;
var distAbs:Number = dist < 0 ? -dist : dist;
//kludge to get constant velocity by recalculating time every frame
_time = distAbs / speed;
TweenLite.to(this, _time, {x:_dest, ease:Linear.easeNone,onComplete:reset});
//CODE END

认为这应该很简单。任何人都可以向我指出任何可能的教程或提出任何建议吗?

任何帮助表示赞赏。

4

2 回答 2

2

http://forums.greensock.com/viewtopic.php?f=1&t=6800上的解决方案/讨论

(警告:这将需要一个相当冗长的解释......)

这是您的代码中的逻辑问题。在您的 onUpdate 中,您正在运行条件逻辑,如果 x 位置超过 980,它会终止补间并将 x 移回 -980 并重新开始。您正在为每个单独的项目执行此操作,每个项目都从不同的位置开始。该初始位置会影响它何时超过该阈值,因此当它们重新定位时,偏移量是不同的。

例如,假设 item1 从 x 位置 0 开始,item2 从 490 开始,两者都以每秒 400 像素开始移动,帧速率为 60,因此它们每帧移动 6.66666 像素。item1 需要 147 帧才能达到 980。但是 item2 需要 74 帧(实际上是 73.5,但没有半帧这样的东西)才能越过 980 阈值,但是当它这样做时,它将处于 x 位置983.333333。此时,由于您的条件逻辑,它会跳回 -980,但请注意它移动了额外的 3.333333 像素。您希望 Item1 和 item2 以完全相同的速度行进,并且它们在补间期间确实如此,但是您的 onUpdate 逻辑使它们在重新定位时未对齐,因此最终,有些行进得比其他行得更多,这会影响它们的整体速度。

另一个问题与 Flash 将 DisplayObjects 的 x/y 坐标四舍五入到最接近的 0.05 的事实有关。因此,当您进行手动重新定位(换行)时,会出现小的舍入误差。例如,假设 TweenLite 将精确的 x 值设置为 980.799。Flash 实际上会将其四舍五入为 980.75。然后,当您像 this.x -= 980 那样重新定位它然后对其进行补间时,该值将在该轮中损失近 0.05 个像素。多次这样做,它可以加起来半个像素或整个像素(或更多)。您的所有项目都在稍微不同的位置越过阈值,因此舍入误差不一样,因此您开始看到间距略有差异。同样,这不是补间引擎的问题。您会看到引擎本身正确设置了值,

在http://forums.greensock.com/viewtopic.php?f=1&t=6800上发布了一个解决方案,其中包括 FLA 和支持文件。

正如其他人所建议的那样,我建议使用一段代码来管理您正在对齐/滚动的所有项目。它会从一个单一的参考点开始布局,以便每次都完美地排列。您可以对应用逻辑的 getter/setter 进行补间。我一直在使用这种技术,而且效果很好。您可以在上面 URL 中附加的代码中看到一个较小规模的示例(ItemBase.as 中的 scrollX getter/setter)

于 2012-01-26T06:56:47.917 回答
0

如果您将在一个维度上无限期地以相同的速率补间所有背景元素 - 为什么不使用 Timer 并完全绕过补间库?

于 2012-01-26T02:06:53.137 回答