Динамическая загрузка изображения во флеш-проект - PullRequest
0 голосов
/ 07 июля 2011

Я пытаюсь создать проект as3, который динамически извлекает изображения из базы данных и вставляет их в рамки флеш-фильма, который я сделал с этим. В настоящее время я следую учебному пособию (в as2, и я конвертирую его в as3 по мере продвижения) и пытаюсь загрузить изображения из того же каталога, что и проект, но у меня возникают проблемы с загрузчиком. Я - полный новичок в as3 и поэтому почти не знаю, что я делаю, поэтому я прихожу к вам, ребята, за помощью, чтобы узнать, почему моя программа не будет работать должным образом. Вот весь код моего проекта.

import flash.net.URLLoader;
import flash.events.Event;
import flash.net.URLRequest;
import flash.display.MovieClip;
import flash.display.*;
import com.greensock.TweenLite;
import com.greensock.easing.*;

var xmlPath = "content.xml";
var photos_xml:XML = new XML();
var imageList:XMLList = new XMLList();
var xmlLoader:URLLoader = new URLLoader();
xmlLoader.addEventListener(Event.COMPLETE, loadXML)
var imageLoader:Loader = new Loader();
imageLoader.addEventListener(Event.INIT, initHandler);
imageLoader.addEventListener(Event.COMPLETE, completeHandler);
var currentImage:Number = 0;
var timer:Number;

xmlLoader.load(new URLRequest(xmlPath));

//stop();

function loadXML(e:Event):void
{
    photos_xml = new XML(e.target.data);
    imageList = photos_xml.image.text();

    //for (var i:int = 0; i < imageList.length(); i++)
//  {
//      trace (imageList[i]);
//  }

    loadImage();
}

function loadImage()
{
    var loadURL = imageList[currentImage]
    var req:URLRequest = new URLRequest(loadURL);
    var targetClip:MovieClip = new MovieClip();
    targetClip.alpha = 0;
    clearInterval(timer);

    //trace(loadURL);
    //======== imageLoader refuses to throw events! ===========
    trace(req.url)
    imageLoader.load(req);
    targetClip.addChild(imageLoader);
    shell_mc.pics_mc.addChild(targetClip);

    trace("I am in loadImage");
}

function setTimer():void
{
    timer = setInterval(loadImage, 1000);
}

function removePrevious(prevImg:MovieClip):void
{
    if (prevImg != null)
    {
        removeChild(prevImg);
        //removeMovieClip(prevImg);
    }

    //trace(currentImage);
    currentImage = (currentImage + 1) % imageList.length();
}

function initHandler(event:Event):void
{
    trace("I am in initHandler");
    TweenLite.to(shell_mc.background_mc, 0.25, {width:event.target.width + 20, height:event.target.height + 20, ease:Quad.easeOut});
    TweenLite.to(shell_mc.border_mc, 0.25, {width:event.target.width, height:event.target.height, ease:Quad.easeOut});
    TweenLite.to(shell_mc.mask_mc, 0.25, {width:event.target.width, height:event.target.height, ease:Quad.easeOut});

    var clipXTarg = Math.round((stage.width / 2) - ((event.target.width + 20) / 2));
    var clipYTarg = Math.round((stage.height / 2) - ((event.target.height + 20) / 2));
    TweenLite.to(shell_mc, 0.25, {x:clipXTarg, y:clipYTarg, ease:Quad.easeOut});

    var prevImgNum:Number;
    if (currentImage == 0)
    {
        prevImgNum = imageList.length() - 1;
    }
    else
    {
        prevImgNum = currentImage - 1;
    }
    var prevImg = shell_mc.pics_mc["pic" + prevImgNum];
    TweenLite.to(prevImg, 0.25, {autoAlpha:0, onComplete:removePrevious(prevImg)});
}

function completeHandler(event:Event):void
{
    trace("I am in completeHandler");
    TweenLite.to(event.target, 0.25, {autoAlpha:100, delay:0.25});
    setTimer();
}

Проблема здесь в том, что imageLoader не генерирует никаких событий, так как он загружает файл изображения, и нет абсолютно никаких ошибок, чтобы дать мне понять, почему это может произойти сбой. Вот как выглядит мой xml-файл:

Активы / DaVinci1.jpg Активы / DaVinci2.jpg Активы / DaVinci3.jpg

И проект, и папка Assets находятся в одном каталоге, поэтому путь к файлу не должен быть проблемой, но в остальном я не знаю. Вот учебник, которому я следую (http://active.tutsplus.com/tutorials/xml/flash-slideshow-xml/)

Ответы [ 2 ]

2 голосов
/ 07 июля 2011

Вам нужно добавить своих слушателей на loader.contentLoaderInfo, а не loader.

imageLoader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);

function completeHandler(event:Event):void
{
    trace("I am in completeHandler");
    TweenLite.to(event.target.content, 0.25, {autoAlpha:100, delay:0.25});
    setTimer();
}

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/Loader.html#contentLoaderInfo

2 голосов
/ 07 июля 2011

Когда вы загружаете типы swf или image, вам нужно добавить EventListener не в loader, а в contentLoaderInfo

contentLoader   = new Loader ();

contentLoader.contentLoaderInfo.addEventListener ( Event.COMPLETE, handleComplete );
contentLoader.contentLoaderInfo.addEventListener ( ProgressEvent.PROGRESS, handleProgress );
contentLoader.contentLoaderInfo.addEventListener ( ErrorEvent.ERROR, handleError );
contentLoader.contentLoaderInfo.addEventListener ( IOErrorEvent.IO_ERROR, handleError );
contentLoader.contentLoaderInfo.addEventListener ( SecurityErrorEvent.SECURITY_ERROR, handleError );

и куда вам нужно загрузить данные (текстовые файлы), как вы делаете с вашим XMLLoader

dataLoader              = new URLLoader ();

dataLoader.addEventListener ( Event.COMPLETE, handleComplete );
dataLoader.addEventListener ( ProgressEvent.PROGRESS, handleProgress );         
dataLoader.addEventListener ( ErrorEvent.ERROR, handleError );
dataLoader.addEventListener ( IOErrorEvent.IO_ERROR, handleError );
dataLoader.addEventListener ( SecurityErrorEvent.SECURITY_ERROR, handleError );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...