在Flash CS5 / ActionScript 3中延迟加载无限滚动背景

时间:2011-02-08 02:12:23

标签: actionscript-3 background lazy-loading flash-cs5

我正在进行的项目有一个巨大的背景图像(800像素宽,2585像素高),向上慢慢向上滚动。

之前,我使用的代码是:http://www.ilike2flash.com/2010/08/endless-scrolling-background-in-as3.html

我修改了代码以向上滚动,但除了有一个奇怪的间歇性错误,偶尔会在图像之后显示一个像素高的空白行并且在循环下一个之前,它实际上似乎并不能很好地处理动态加载(我尝试过使用几个不同的预加载器脚本并打破所有这些脚本,这可能不是初始实现的问题,但现在我正在使用一个巨大的巨大图像。

因此,我的问题是:

一个。还有另外一些免费的,基于Flash的无限滚动代码浮动,支持延迟加载背景对象(比如,现有背景在6中被切断)?

湾如果没有,任何想法如何修改上述链接呢?

谢谢!我的AS3如下:

stop();

//The speed of the scroll movement.
var scrollSpeed:uint = 2;

//This adds two instances of the movie clip onto the stage.
var s1:ScrollBg = new ScrollBg();
var s2:ScrollBg = new ScrollBg();
addChild(s1); 
addChild(s2);
setChildIndex(s1, 0);
setChildIndex(s2, 0);

//This positions the second movieclip next to the first one.
s1.y = 0;
s2.y = s1.height;

//Adds an event listener to the stage. 
stage.addEventListener(Event.ENTER_FRAME, moveScroll); 

//This function moves both the images to top. If the first and second 
//images goes past the top stage boundary then it gets moved to 
//the other side of the stage. 
function moveScroll(e:Event):void{
  s1.y -= scrollSpeed;  
  s2.y -= scrollSpeed;  

  if(s1.y <= -s1.height){
     s1.y = s1.height - scrollSpeed;
  }else if(s2.y <= -s2.height){
     s2.y = s2.height - scrollSpeed;
  }
}

4 个答案:

答案 0 :(得分:1)

你好吗? 该链接有大约15行代码。 它创建对象的两个实例,然后移动每帧移动1px并检查第一个剪辑是否在视图之外,此时它将movieClip移动到另一个剪辑的边缘。没有太多的错误空间...但如果我不得不指出它,我会说它就在这里

if(s1.x < -s1.width){
  s1.x = s1.width;
}else if(s2.x < -s2.width){
  s2.x = s2.width;
}

应该是:(注意<=而不是<

if(s1.x <= -s1.width){
  s1.x = s1.width;
}else if(s2.x <= -s2.width){
  s2.x = s2.width;
}

这消除了动画片段之间的几个像素间隙

就处理加载大资产而言,只需在加载后添加滚动功能即可。您可以在http://drawlogic.com/2007/09/20/howto-using-loaders-in-as3/查找样本,但还有很多其他样本。

答案 1 :(得分:1)

至于“图像之后的像素高空行和下一个循环之前”这个修复摆脱了我的空白......

if (s1.x <=  -  s1.width) { s1.x = s2.x + s2.width; }
else if (s2.x <= -s2.width) { s2.x = s1.x + s1.width; }

请注意,背景1的x位置位于背景2的x位置加上它的宽度,反之亦然。

答案 2 :(得分:0)

我认为你需要一个圆形图像宽度/高度才能让它在演示中得到很好的工作,flash不会像渲染.5px间隙那样。你可以随时尝试将图像推到位置另外,只是为了确保事情正确对接并希望它更好:

if(s1.x < -s1.width){
  s1.x = s2.x + s2.width;
}else if(s2.x < -s2.width){
  s2.x = s1.x + s1.width;
}

当涉及延迟加载背景时,你需要小心它并检查下一部分图像是否已经完成加载,然后再开始滚动它,只记得将图像源存储在某个地方的var中(也许使用静态“延迟加载”类?)所以你试图多次调用url而不需要。

答案 3 :(得分:0)

尝试查看Greensock's Blitmask。使用它,您只需要一个可重复的图像,并且blitmask经过高度优化,即使对于手机功能较弱的处理器也是如此。