Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Правильная последовательность загрузки (http://www.flasher.ru/forum/showthread.php?t=204163)

GrafMine 21.10.2013 21:50

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

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

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

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

Цитата:

Сообщение от Akopalipsis (Сообщение 1149419)
Вы первым делом сделайте это в отдельном классе. Если не сможете, то скажите, я покажу как.

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

udaaff 21.10.2013 22:17

Грузите последовательно.

GrafMine 21.10.2013 22:19

Цитата:

Сообщение от udaaff (Сообщение 1149421)
Грузите последовательно.

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

Akopalipsis 21.10.2013 22:19

Цитата:

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

GrafMine 21.10.2013 22:24

Цитата:

Сообщение от Akopalipsis (Сообщение 1149423)
Тогда нужно в этом цикле сделать булеву переменную, которая будет показывать загружается ли в данный момент или нет. И таймер, который будет работать пока булева переменная не станет фалсе. И только тогда разрешать циклу продолжать. Но это не правильно.

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

udaaff 21.10.2013 22:28

Цитата:

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

GrafMine 22.10.2013 00:00

Цитата:

Сообщение от udaaff (Сообщение 1149427)
В смысле, грузите первую картинку, после неё следующую, а не все разом.

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

udaaff 22.10.2013 00:14

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

Akopalipsis 22.10.2013 00:41

Код AS3:

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

У меня чуть попроще было

Код AS3:

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


Часовой пояс GMT +4, время: 16:26.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.