PDA

Просмотр полной версии : Правильная последовательность загрузки


GrafMine
21.10.2013, 21:50
Проблема в том что каждую картинку загружает с разным интервалом времени , пока загрузиться одна может перед ней загрузиться 3, и получается так что последовательность в массиве уже не соответствует задуманному .

for (var ii:Number=0; ii < MAP_IMG_localeXML.st.length(); ii++) {
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event) : void {
//map_imagesArray[Number(MAP_IMG_localeXML.st[i].@id)]= e.target.content; <-- пробовал и так
//map_imagesArray[ii] = e.target.content; <- пробовал и так
map_imagesArray.push(e.target.content);
loaded++;
trace("loaded :"+loaded);
});
loader.load(new URLRequest(String(MAP_IMG_localeXML.st[ii].@img)));
}

При попытке присвоить конкретному слоту в массиве картинку, их не отображает вовсе( мистика ;) )
ну а когда в коде нужно уже передать картинку с загруженного массива

map_img = map_imagesArray[4];
Lvl_a = map_imagesArray[0];
Lvl_b = map_imagesArray[1];

Причем закономерность такова: если присвоить только map_img то он отобразиться нормально и как положено, а чем больше присваиваний с этого массива тем все будет хаотичнее картинки по данным слотам ( например может на картинку кнопки кинуть изображение большой карты или картинку вообще не со сферы кнопок )
Кто сталкивался вообще с таким ? мне кажется вся проблема из-за не правильного объявления и присвоения в массив картинок.

Akopalipsis
21.10.2013, 22:11
Вы первым делом сделайте это в отдельном классе. Если не сможете, то скажите, я покажу как.

GrafMine
21.10.2013, 22:12
Вы первым делом сделайте это в отдельном классе. Если не сможете, то скажите, я покажу как.

какой смысл?)

udaaff
21.10.2013, 22:17
Грузите последовательно.

GrafMine
21.10.2013, 22:19
Грузите последовательно.

тогда в чем может быть ошибка ?

Akopalipsis
21.10.2013, 22:19
какой смысл?)
Тогда нужно в этом цикле сделать булеву переменную, которая будет показывать загружается ли в данный момент или нет. И таймер, который будет работать пока булева переменная не станет фалсе. И только тогда разрешать циклу продолжать. Но это не правильно.

GrafMine
21.10.2013, 22:24
Тогда нужно в этом цикле сделать булеву переменную, которая будет показывать загружается ли в данный момент или нет. И таймер, который будет работать пока булева переменная не станет фалсе. И только тогда разрешать циклу продолжать. Но это не правильно.

ну цикл ведь не бесконечный у него определенное кол-во раз задано сколько и картинок, как ему всегда проверять если ли загрузка ? да и судя с коментария udaaff все проходит правильно, ошибка где-то в другом месте...

udaaff
21.10.2013, 22:28
Грузите последовательно.
В смысле, грузите первую картинку, после неё следующую, а не все разом.

GrafMine
22.10.2013, 00:00
В смысле, грузите первую картинку, после неё следующую, а не все разом.

Собственно это и есть мой вопрос темы - "КАК? " :)

udaaff
22.10.2013, 00:14
В обработчике COMPLETE стартуйте следующую загрузку, без всяких циклов.

Akopalipsis
22.10.2013, 00:41
package
{
import flash.display.Bitmap;
import flash.display.DisplayObject;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.IEventDispatcher;
import flash.events.IOErrorEvent;
import flash.events.MouseEvent;
import flash.net.URLRequest;

public class Main extends Sprite
{
private var _paths:Vector.<URLRequest>;
private var _images:Vector.<Bitmap>;
private var _loader:Loader;
private var _id:uint;
public function Main()
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);

var xml:Array = ['button-in.png', 'button-out.png'];

_id = 0;

_paths = new Vector.<URLRequest>([]);

var length:int = xml.length;
for (var i:int = 0; i < length; i++)
{
_paths.push(new URLRequest(xml[i]));
}

_images = new Vector.<Bitmap>([]);

_loader = new Loader();
this.addListener(_loader.contentLoaderInfo);
this.addLoaded(_paths[0]);
}
private function addLoaded(url:URLRequest):void
{
try
{
_loader.load(url);
}
catch (error:Error)
{
trace(error.message);
}
}
private function addListener(dispatcher:IEventDispatcher):void
{
dispatcher.addEventListener(Event.COMPLETE, dispatcher_completeHandler);
dispatcher.addEventListener(IOErrorEvent.IO_ERROR, dispatcher_ioErrorHandler);
trace("###Слушатели - добавлены");
}
private function removeListener(dispatcher:IEventDispatcher):void
{
dispatcher.removeEventListener(Event.COMPLETE, dispatcher_completeHandler);
dispatcher.removeEventListener(IOErrorEvent.IO_ERROR, dispatcher_ioErrorHandler);
_loader = null;
trace("###Слушатели - удалены");
}
private function dispatcher_ioErrorHandler(event:IOErrorEvent):void
{
trace(event.errorID);
}

private function dispatcher_completeHandler(event:Event):void
{
var bitmap:Bitmap = event.target.content as Bitmap;
_images[_id] = bitmap;
_id++;
_paths.shift();
if (_paths.length) this.addLoaded(_paths[0]);
else this.removeListener(_loader.contentLoaderInfo);
}
}

}

in4core
22.10.2013, 00:59
У меня чуть попроще было

package com.in4core.loaders
{
import flash.display.Loader;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.net.URLRequest;

/**
* ...
* @author in4core
* // Class for Loading multi images for Air
*/
public class CustomMultiLoader extends EventDispatcher
{
private var _imageArray:Array = [];
private var _loader:Loader = new Loader();
private var _images:Array = [];
private var _index:int = 0;

public function CustomMultiLoader():void
{
super();
}

public function add(imagePath:String):void {

var req:URLRequest = new URLRequest(imagePath);
_imageArray.push(req);

}

public function load():void {

if (_imageArray == null) return;

if (_index == _imageArray.length ) {

dispatchEvent(new CustomMultiLoaderEvents(CustomMultiLoaderEvents.LOADED , content));

_imageArray = [];
_index = 0;
_images = [];

return;
}
_loader.contentLoaderInfo.removeEventListener(Event.COMPLETE , loadComp);
_loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR , onError);
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE , loadComp);
_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR , onError);
_loader.load(_imageArray[_index]);
_index++;



}

private function onError(e:IOErrorEvent):void
{
_imageArray = [];
_index = 0;
_images = [];
dispatchEvent(new CustomMultiLoaderEvents(CustomMultiLoaderEvents.ERROR,[]));
}

private function loadComp(e:Event):void
{
_images.push(e.currentTarget.content);
load();
}

private function get content():Array {

return _images;
}
}

}

Akopalipsis
22.10.2013, 01:13
У меня чуть попроще было
Зато у меня нету проверки на ноль длины массива и на ноль битмапы.

GrafMine
22.10.2013, 15:24
С двух предоставленных примеров слепил под себя код, и все получилось.
Спасибо udaaff Akopalipsis in4core