2013-03-13 3 views
1

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


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); 
} 
+0

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

+0

Я использую код в мувиклипе, и я использую один и тот же мувиклип 3 раза. Так, например, анимация начинается с того, что 3 карты перевернулись, а затем один щелчок, а затем следующий щелчок, а затем последний щелчок. Из этих 3 я не хочу повторений из XML-документа. – 2013-03-13 19:15:21

+0

Вы хотите, чтобы при каждой новой загрузке страницы она отображала следующие три изображения. Как ваша структура XML? –

ответ

0

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

После того, как вы загрузили в 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 и т.д.)

+0

Большое вам спасибо за вашу помощь @Marcela. Я все еще немного запутался в том, чтобы объединить все это. Думаю, я понимаю, что вы говорите о том, как не нужно загружать xml несколько раз в мувиклип, когда я могу просто сделать это один раз в первом кадре. Все это выглядит правильно? (разделены мувиклипом и 1-й рамкой) ** movieclip ** 'function setPic (stImage: String): void { picLoader = new Loader(); picLoader.contentLoaderInfo.addEventListener (Event.COMPLETE, gotPic); picLoader.load (новый URLRequest (stImage)); addChild (picLoader); } ' – 2013-03-14 01:17:53

+0

** первая рама: ** var pHeight: Number = 84; var pWidth: Number = 120; var listLoader: URLLoader = новый URLLoader (новый URLRequest («www.example.com/example.xml»)); var picLoader: Loader = new Loader(); var images: Array = []; для каждого (var imgObj: XML в xml.img) { images.push (imgObj.нанизывать()); } images.sort (function (a: Object, b: Object): int {return Math.random()> .5? -1: 1}) для (var i: int = 0; i 2013-03-14 01:19:13

+0

Исправить, если вам нужно определить 'pHeight' и' pWidth' в мувиклипе, так как именно там вы их используете. – Marcela