Загрузка изображения дважды через Actionscript3? - PullRequest
0 голосов
/ 11 февраля 2011

Я пытаюсь использовать бесконечный свиток 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 ]

1 голос
/ 11 февраля 2011

Вы можете загрузить безобразное изображение один раз, а затем использовать 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

Я использовал события мыши для прокрутки изображений, так как я не был уверен, какойскроллер, который вы использовали, но его легко изменить, чтобы он соответствовал вашему сценарию.

1 голос
/ 11 февраля 2011

По-видимому, он отображает обе копии, но поверх друг друга.Это происходит потому, что флеш-плеер не знает, какой у него размер s1 до загрузки.Вы должны расположить ваши изображения в пределах loadComplete ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...