我需要在父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
认为这应该很简单。 任何人都可以指出任何可能的教程或提出任何建议吗?
任何帮助表示感谢。
答案 0 :(得分: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像素每帧。第1项将需要147帧才能达到980.然而,第2项将需要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。然后,当你重新定位它像这个x - = 980,然后补间它时,该值在那一轮上刚刚丢失了近0.05个像素。这样做很多次,它可以加起来一半像素或整个像素(或更多)。您的所有项目都在略微不同的点处越过阈值,因此舍入误差不相同,因此您开始看到间距略有差异。同样,这不是补间引擎的问题。您将看到引擎本身正确设置了值,但Flash在应用于DisplayObjects时会在内部对其进行舍入。
在http://forums.greensock.com/viewtopic.php?f=1&t=6800发布了一个解决方案,其中包含FLA和支持文件。
正如其他人所建议的那样,我建议使用一大块代码来管理您正在调整/滚动的所有项目。它会从一个参考点中解决问题,以便每次都能完美排列。您可以补间应用逻辑的getter / setter。我一直使用这种技术,效果很好。您可以在我在上面的URL中附加的代码中看到一个较小规模的示例(ItemBase.as中的scrollX getter / setter)
答案 1 :(得分:0)
如果您将在一个维度上无限期地以相同的速率补间所有背景元素 - 为什么不使用Timer并完全绕过补间库?