2011-02-11 127 views
0

我想使用无限滚动AS3我在this SO question讨论。我正在使用FlashCS5 IDE进行开发。通过Actionscript3加载图像两次?

我需要做的绝对最后一件事是在电影的其余部分加载完毕后从外部加载大背景图像(“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; 
} 
} 

回答

1

显然它显示两个副本,但在彼此之上。 发生这种情况的原因是Flash播放器在加载之前不知道s1有多高。你应该位置)内loadComplete您的图像(

+0

您好,先生,赢得了万亿美元的互联网。这一直在扰乱我至少一个星期。谢谢! – aendrew 2011-02-11 09:14:30

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 

我用鼠标事件,我没来滚动图片不知道你使用的是什么样的滚轮,但应该很容易修改它以适应你的情况。

+0

+10 for copyPixels();码。我今天在两个有线上网本上加载了我的文件,这很残酷。现在快得多。此外 - 我试过你的代码,它似乎不滚动两次后加载第二个图像。我可能已经拙劣地将它调整到我自己的目的地,但是你可能想要调查这些代码是否在任何地方。 – aendrew 2011-03-09 08:52:39