AS3 случайное изображение из XML - никогда не повторять

Я создаю рекламный баннер во флэш-памяти, который показывает 3 случайных изображения из файла XML после загрузки страниц. Моя проблема в том, что это будет иногда повторяться. Я включил свой код, любой совет?


var pHeight:Number = 84;
var pWidth:Number = 120;


var listLoader:URLLoader = new URLLoader( new URLRequest("www.example.com/example.xml") );
var picLoader:Loader = new Loader();

listLoader.addEventListener(Event.COMPLETE, gotList);

function gotList(evt:Event):void {
    var xmlData:XML = XML(listLoader.data);
    var numImages:Number = xmlData.picture.length();
    var stImage:String = xmlData.picture[Math.floor(numImages*Math.random())].toString();

    picLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, gotPic);
    picLoader.load( new URLRequest(stImage) );

    listLoader.removeEventListener(Event.COMPLETE, gotList);
}

function gotPic(evt:Event):void {
    var thisBmp:Bitmap = Bitmap(evt.target.content);
    thisBmp.x = 0;
    thisBmp.y = 0;
    var thisWidth:Number = thisBmp.width;
    var thisHeight:Number = thisBmp.height;

    thisBmp.scaleX = pWidth/thisWidth;
    thisBmp.scaleY = pHeight/thisHeight;
    addChild(thisBmp);

    picLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, gotPic);
}

1 ответ

Решение

Как упоминалось в комментариях, вы захотите перенести загрузку XML из MovieClip в ваш класс main/document (или если вы работаете над временной шкалой, вы можете поместить ее туда... Я не одобряю такое поведение, я просто хочу иметь возможность ответить на ваш вопрос независимо от вашего метода).

После того, как вы загрузили XML один раз, вы можете взять изображения оттуда, поместить их в Arrayи сделать случайную сортировку:

var images:Array = [];
for each(var imgObj:XML in xml.img){
    images.push(imgObj.toString());
}
images.sort(function(a:Object,b:Object):int{return Math.random() > .5 ? -1 : 1})

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

Следующее, что вы хотите сделать, это создать публичный метод на вашем MovieClip это позволит вам установить изображение для этого клипа:

function setPic(stImage:String):void {
    picLoader = new Loader();
    picLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, gotPic);
    picLoader.load( new URLRequest(stImage) );
    addChild(picLoader);
}

Наконец, вы можете использовать это setPic метод, чтобы установить изображение на каждом экземпляре вашего MovieCilp:

for(var i:int = 0; i < images.length; i++)
{
    this["mc"+(i+1)].setPic(images[i]); 
}

Это предполагает определенное соглашение об именах ваших MovieClip экземпляры (mc1,mc2,так далее)

Другие вопросы по тегам