通过Actionscript3加载图像两次?

时间:2011-02-11 08:12:33

标签: flash actionscript-3 lazy-loading loading

我正在尝试使用我在this SO question中讨论的无限滚动AS3。我正在使用FlashCS5 IDE开发它。

我需要做的最后一件事是在加载完电影的其余部分后从外部加载大背景图像(“header_bg_vert.jpg”),而不是要求预先加载整个动画(或预加载标题)动画)。

我的AS3在下面。 “无限循环”通过端对端放置相同无缝图像的两个副本,然后在滚动屏幕后将第二个图像移动到前面来工作 - 目前,此代码仅显示图像的一个副本。它出什么问题了?此外,这是实现这一目标的最佳方式吗?

非常感谢。

stop();

//load the bg image
var request:URLRequest = new URLRequest("header_bg_vert.jpg");
var s1:Loader = new Loader();
var s2:Loader = new Loader();

s1.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgress);
s1.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);

s2.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgress);
s2.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);


function loadProgress(event:ProgressEvent):void {
var percentLoaded:Number = event.bytesLoaded/event.bytesTotal;
percentLoaded = Math.round(percentLoaded * 100);
trace("Loading: "+percentLoaded+"%");
}
function loadComplete(event:Event):void {
trace("Complete");
}

s1.load(request);
s2.load(request);

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

//Originally, this added 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 left. If the first and second 
//images goes pass the left 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;
}
}

2 个答案:

答案 0 :(得分:1)

显然它会同时显示两个副本。 这是因为flash播放器在加载之前不知道s1有多高。您应该将图像放在loadComplete()

答案 1 :(得分:1)

您可以加载一次无缝图像,然后使用copyPixels()制作2张图像副本:

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.ProgressEvent;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.net.URLRequest;

var bitmap1:Bitmap;
var bitmap2:Bitmap;

var loader:Loader = new Loader();
loader.load(new URLRequest("images/seemless.png"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onLoaderProgress);

function onLoaderProgress(e:ProgressEvent):void
{
    var percent:Number = Math.floor((e.bytesLoaded/e.bytesTotal)*100); 

}// end function

function onLoaderComplete(e:Event):void
{
    var bitmap:Bitmap = Bitmap(e.target.content);

    var bitmapData1:BitmapData = new BitmapData(bitmap.width, bitmap.height);
    var bitmapData2:BitmapData = new BitmapData(bitmap.width, bitmap.height);

    bitmapData1.copyPixels(bitmap.bitmapData,
                           bitmap.bitmapData.rect,
                           new Point(0,0));

    bitmapData2.copyPixels(bitmap.bitmapData,
                           bitmap.bitmapData.rect,
                           new Point(0,0));

    bitmap1 = new Bitmap(bitmapData1);
    var bitmapSprite1:Sprite = new Sprite();

    bitmapSprite1.addChild(bitmap1);

    bitmap2 = new Bitmap(bitmapData2);
    var bitmapSprite2:Sprite = new Sprite();
    bitmapSprite2.addChild(bitmap2);
    bitmap2.x = bitmap2.width;

    addChild(bitmapSprite1);
    addChild(bitmapSprite2);

    stage.addEventListener(MouseEvent.MOUSE_OVER, onStageMouseOver);
    stage.addEventListener(MouseEvent.MOUSE_OUT, onStageMouseOut);

}// end function

function onStageEnterFrame(e:Event):void
{
    var speed:Number = 10;

    if(stage.mouseX < stage.stageWidth/2)
    {
        bitmap1.x -= speed;
        bitmap2.x -= speed;

    }// end if

    if(stage.mouseX > stage.stageWidth/2)
    {
        bitmap1.x += speed;
        bitmap2.x += speed;

    }// end if

    if(bitmap1.x <= -(bitmap1.width))
    {
        bitmap1.x = bitmap1.width;

    }// end if

    if(bitmap2.x <= -(bitmap2.width))
    {
        bitmap2.x = bitmap2.width;

    }// end if

    if(bitmap1.x >= bitmap1.width)
    {
        bitmap1.x = -(bitmap1.width);

    }// end if

    if(bitmap2.x >= bitmap2.width)
    {
        bitmap2.x = -(bitmap2.width);

    }// end if

}// end function

function onStageMouseOver(e:MouseEvent):void
{
    stage.addEventListener(Event.ENTER_FRAME, onStageEnterFrame);

}// end function

function onStageMouseOut(e:MouseEvent):void
{
    if(stage.hasEventListener(Event.ENTER_FRAME))
    stage.removeEventListener(Event.ENTER_FRAME, onStageEnterFrame);

}// end function

我使用鼠标事件来滚动图像,因为我不确定您使用的是哪种滚动条,但应该很容易修改它以适合您的场景。