Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Loader:Загрузка изображений в массив. (http://www.flasher.ru/forum/showthread.php?t=202650)

Fogflasher 30.07.2013 16:30

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

Получился вот такой код:

Код AS3:

package
{
          import flash.display.*;
          import flash.events.*;
          import flash.net.*;
 
          public class Image_array_load extends Sprite
          {
                        private var imageCounter:uint;
                        private var imageLoader:Loader;
 
                        private var BitData:BitmapData;
                        private var BitItem:Bitmap;
 
                        private var PicArray:Array = new Array();
 
                        public function Image_array_load() 
                        {
                                  for(var i:uint = 0; i < 3; i ++ )
                                  {
                                        imageCounter = i;
                                        imageLoader = new Loader();
                                        imageLoader.load( new URLRequest("text" + String(i + 1) + ".png" ) );
                                        imageLoader.contentLoaderInfo.addEventListener(Event.INIT, initListener);
                                }
 
                                ArrayDisplay();
 
                        }                                                                       
 
                        private function initListener (e:Event):void
                        {
 
                          BitData = Bitmap(imageLoader.content).bitmapData;
                          BitItem = new Bitmap(BitData);
 
                          PicArray[imageCounter] = BitItem;
 
                        }
 
                        public function ArrayDisplay():void
                        {
 
                          for(var i:uint = 0; i < 3; i ++ )
                                  {
                                  PicArray[i].x = (stage.stageWidth - PicArray[imageCounter].width) * 0.5;
                                  PicArray[i].y = (stage.stageHeight - PicArray[imageCounter].height) * 0.25 * i;
 
                                  addChild(PicArray[i]);
                                }
                        }
 
 
          }
}

Вроде бы всё логично, но получается вот такая Output-ошибка:

Цитата:

TypeError: Error #1010: A term is undefined and has no properties.
at Image_array_load/ArrayDisplay()
at Image_array_load$iinit()
Похоже, ему функция ArrayDisplay() не нравится... Но что с ней не так?

KumoKairo 30.07.2013 16:36

На момент обращения к
Код AS3:

PicArray[i]

в массиве нет ни одного элемента - в AS3 этот процесс асинхронный.
Плюс ко всему лучше подписывать сам лоадер на Event.COMPLETE:
Код AS3:

imageLoader.addEventLsitener(Event.COMPLETE, initListener);
private function initListener (e:Event):void
{
...
}

И вызывать функцию ArrayDisplay либо после того как все картинки загрузятся, либо каждый раз передавая полученную картинку

Fogflasher 30.07.2013 17:06

KumoKairo, нда, действительно пишет undefined.

1. Исправил на EVENT.COMPLETE.

2. Меня интересует вариант "после того как все картинки загрузятся".
Казалось бы, вот такой костыль должен решать:
Код AS3:

                                if (imageCounter == 2)
                                {
                                        ArrayDisplay();
                                }

А нифига, трэйсы всё равно выдают:

Цитата:

imageCounter = 0
imageCounter = 1
imageCounter = 2
PicArray[0] undefined
PicArray[1] undefined
PicArray[2] undefined

KumoKairo 30.07.2013 17:11

Добавляйте в массив с помощью .push();
Код AS3:

PicArray.push(BitItem);


Fogflasher 30.07.2013 17:28

Кхм, что-то не помогает.

Но, кстати, если код значительно упростить:
Код AS3:

 
package
{
          import flash.display.*;
          import flash.events.*;
          import flash.net.*;
 
          public class Image_array_load extends Sprite
          {
                        private var imageCounter:uint;
                        private var imageLoader:Loader;
 
                        private var BitData:BitmapData;
                        private var BitItem:Bitmap;
 
                        private var PicArray:Array;
 
                        public function Image_array_load() 
                        {
 
                                PicArray = new Array();
 
                                for(var i:uint = 0; i < 3; i ++ )
                                  {
                                        imageCounter = i;
                                        trace("for: imageCounter = ", imageCounter);
 
                                        imageLoader = new Loader();
                                        imageLoader.load( new URLRequest("text" + String(i + 1) + ".png" ) );
                                        imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, initListener);
 
                                }
 
 
 
                        }                                                                       
 
                        private function initListener (e:Event):void
                        {
 
                          BitData = Bitmap(imageLoader.content).bitmapData;
                          BitItem = new Bitmap(BitData);
 
                          trace("initListener:imageCounter = ", imageCounter);
 
 
                        }
 
 
 
 
          }
}

То получается, вот такая хрень:

Цитата:

for: imageCounter = 0
for: imageCounter = 1
for: imageCounter = 2
initListener:imageCounter = 2
initListener:imageCounter = 2
initListener:imageCounter = 2
То есть метод initListener почему-то имеет переменную уже сразу в значени 2... что за ботва, непойму.

Может при выходе из цикла что-то происходит.

KumoKairo 30.07.2013 17:46

imageCounter надо увеличивать при загрузке картинки, а не в цикле, где вы только говорите программе загрузить картинки)

У вас в конце цикла imageCounter сразу становится равным 2, и три загрузчика начинают трудиться над загрузкой изображений. И после загрузки каждого изображения в отдельности вызывается функция initListener()

Поэтому первый вызов nitListener() произойдет "намного" позже окончания цикла

Fogflasher 31.07.2013 09:49

Переработал с учетом замечаний:

Код AS3:

package
{
          import flash.display.*;
          import flash.events.*;
          import flash.net.*;
 
          public class Image_array_load extends Sprite
          {
                        private var imageCounter:uint = 0;
                        private var imageLoader:Loader;
 
                        private var BitData:BitmapData;
                        private var BitItem:Bitmap;
 
                        private var PicArray:Array;
 
                        public function Image_array_load() 
                        {
 
                                PicArray = new Array();
 
                                for(var i:uint = 0; i < 3; i ++ )
                                  {
 
                                        imageLoader = new Loader();
                                        imageLoader.load( new URLRequest("text" + String(i + 1) + ".png" ) );
                                        imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, initListener);
 
                                }
 
 
 
                        }                                                                       
 
                        private function initListener (e:Event):void
                        {
 
 
 
                                  BitData = Bitmap(imageLoader.content).bitmapData;
                                  BitItem = new Bitmap(BitData);
                                  trace("BitData = ", BitData);
                                  trace("BitItem = ", BitItem);
 
                                  trace("BEFORE: imageCounter = ", imageCounter);
                                  trace("BEFORE: PicArray[" + String(imageCounter) + "] = ", PicArray[imageCounter]);
 
                                  PicArray.push(BitItem);
//                                  PicArray[imageCounter] = BitItem;
 
                                  imageCounter ++;
 
                                  trace("AFTER: imageCounter_end = ", imageCounter);
                                  trace("AFTER: PicArray[" + String(imageCounter - 1) + "] = ", PicArray[imageCounter - 1]);
 
                                  if (imageCounter > 2)
                                  {
                                          ArrayDisplay();
                                  }
 
 
 
 
 
                        }
 
                        public function ArrayDisplay():void
                        {
 
                          trace("ArrayDisplay()!");
                          for(var i:uint = 0; i < 3; i ++ )
                                  {
                                          PicArray[i].x = i * 10;
                                          PicArray[i].y = i * 30;
 
                                          addChild(PicArray[i]);
 
                                }
                        }
 
 
          }
}

Было еще два бага с If и с трэйсом imageCounter'a, щас вот исправил их.

Теперь всё работает, спасибо ^_^

P.S. Кстати, в подсветке форумных кодов, трэйс-кавычечные элементы можно было бы сделать своим цветом, ну например светло-коричневым.
А то сливается с кодом других команд, эргономичность ниже.

Wolsh 31.07.2013 10:18

)) А то что вы глаголы Пишете с большой буквы, эргономичность не Снижает?
В AS3 только названия классов пишутся с большой буквы. Привыкайте сразу, потом будет тяжело перестраиваться.

Fogflasher 31.07.2013 11:02

Да не, яж не наезжаю, так чисто выразил соображение. Если по каким-то причинам этого нельзя - да пожалуйста.

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

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

Wolsh 31.07.2013 13:48

public class Image_array_load // правильно: ImageToArrayLoader ("camel style", горбатый как верблюд)
Не надо прочерков, разве что при именовании констант, которые полностью набираются капсом, то есть public static const START_FIGHTING:String = "startFighting";
public function ArrayDisplay():void // правильно: displayArray (глаголы, то есть функции, с маленькой)
private var PicArray:Array; // правильно: _picArray (приватные переменные начинаются с подчеркивания и с маленькой)

Fogflasher 31.07.2013 14:01

Wolsh, аа вот оно что, а я думал глаголы в камментах этого форума )))

Ок, учтём.

Fogflasher 05.08.2013 09:24

Оппа. А эта программа (как оказалось) работает не правильно.

Она три раза подряд выдает третье изображение.
Я даже подозреваю, что все три элемента массива содержат третье изображение.

Опять какие-то мутно-уловимые асинхронные штуковины?

Прошу помощи в нахождении бага.
Или может быть, всё надо переделывать с нуля.
Не знаю точно как, может быть сначала создать массив URLRequest значений, и цикл другого типа юзать.

Wolsh 05.08.2013 10:03

А чего Вы ждали, у Вас же один Лоадер сохраняется в приватной переменной, последний из создаваемых в цикле. Или Вы думали, что одна переменная будет хранить все три Лоадера в себе?))
Соответственно в обработчике Вы у этого последнего Лоадера и забираете то что он загрузил, независимо от того, какой Лоадер на самом деле послал событие COMPLETE:
Код AS3:

BitData = Bitmap(imageLoader.content).bitmapData;

А надо
Код AS3:

BitData = Bitmap(e.currentTarget.content).bitmapData;

и приватная ссылка вобщем-то не нужна.

Fogflasher 05.08.2013 12:26

Wolsh, благодарю за багфикс, теперь все три картинки выводятся.

Цитата:

А чего Вы ждали, у Вас же один Лоадер сохраняется в приватной переменной, последний из создаваемых в цикле.
Или Вы думали, что одна переменная будет хранить все три Лоадера в себе?))
Хм, всё-равно что-то я не до конца просекаю фишку.

Рассмотрим по итерациям.
1. i = 0, Создаем экземпляр imageLoader, Грузим в него "text1.png", Запускаем слушатель.
2. Выходим из цикла for. В переменную BitData записываем картинку text1.png, Перекидываем ее в BitItem.
3. Засовываем его в PicArray[0], Наращиваем переменную индекса массива.
4. Возвращаемся в цикл for, получаем i = 1, повторяем.

Я же успел значение text1.png засунуть в массив!
И при следующей итерации, то же должно произойти с text2.png...

Цитата:

Или Вы думали, что одна переменная будет хранить все три Лоадера в себе?))
Ээ, ну она временно хранит один лоадер, и успевает передать его в массив. Или не успевает?

Цитата:

Соответственно в обработчике Вы у этого последнего Лоадера и забираете то что он загрузил,
независимо от того, какой Лоадер на самом деле послал событие COMPLETE:
Код AS3:
BitData = Bitmap(imageLoader.content).bitmapData;
Странно, а разве на каждой итерации не должен происходить выход из цикла for в слушатель?
Я предполагал, что либо этот выход происходит каждый раз, и я успеваю засунуть значение в массив.
Либо же, как-то асинхронно запустяццо три слушателя, и каждый (уже сложнее представить такое, лол) как-то разрулит ситуацию сам, ведь он успел получить соответствующую ему строку.

Цитата:

А надо
Код AS3:

BitData = Bitmap(e.currentTarget.content).bitmapData;
Эта строка мне понятна чисто технически: она более точна и берет данные от экземпляра текущего события.
Однако почему она не равнозначна той записи (по указанным выше моментам), не очень понятно.

Wolsh 05.08.2013 14:42

Цитата:

Ээ, ну она временно хранит один лоадер, и успевает передать его в массив. Или не успевает?
А где там передача Лоадера в массив? О__о
Цитата:

Странно, а разве на каждой итерации не должен происходить выход из цикла for в слушатель?
На каком основании? Слушатель потому так и называется, что слушает. То есть ждет, когда случится событие. И будет вызван, только когда картинка загрузится. А цикл... сто тысяч итераций цикла пролетит за десять миллисекунд. Картинка не то что загрузиться не успеет, запрос еще до сервера не дойдет.
Учите основы. Читайте главы про событийную модель. Если нужно, пейте кофе.
Цитата:

Однако почему она не равнозначна той записи
В той записи у Вас одна переменная, которая может хранить только одну ссылку на Лоадер. Поскольку цикл отработал еще до того как сервер понял что его о чем-то спрашивают, в этой переменной ссылка только на последний созданный Лоадер (остальные может еще существуют, но по правилам их должен был съесть СборщикМусора, ибо ссылок на них не осталось). В записи через таргет же Вы обращаетесь именно к тому Лоадеру, который послал событие, загрузив картинку.

Fogflasher 05.08.2013 15:18

Вот оно как, картина начинает проясняться.

Хотя некоторые сомнения всё-таки остаются.
Например, если сборщик мусора сжирает первые две инициации initListener, тогда, вроде как и эта строка
Код AS3:

BitData = Bitmap(e.currentTarget.content).bitmapData;

не должна помогать, потому что двое первых e.currentTarget.content уже были "сожраны лангоньерами".
Впрочем, не хочу отвлекать вас лишний раз, нужно перечитывать главу Мука про события.
Тем более, что кофе пока вне доступа, да к тому же еще и понедельник : )

Хотелось бы, разве что, обратить внимание на вот этот фрагмент:

Цитата:

и приватная ссылка вобщем-то не нужна.
Если я всё правильно понял, то:

Код AS3:

private var imageLoader:Loader;

нужно заменить на введение локальной переменной цикла:
Код AS3:

for(var i:uint = 0; i < 3; i ++ )
                                  {
                                        var imageLoader:Loader;      //добавлено
 
                                        imageLoader = new Loader();
                                        imageLoader.load( new URLRequest("text" + String(i + 1) + ".png" ) );
                                        imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, initListener);
 
                                }

Я протестировал - оба варианта работают.

И можно отметить интересный ньюанс:
В изначальном варианте, порядок вывода картинок такой:
Вторая, Третья, Первая. (похоже, это зависит от размеров файлов: 39Кб, 34Кб, 31Кб)

В исправленном варианте, порядок вывода картинок такой:
Третья, Первая, Вторая. (здесь принцип непонятен).

Wolsh 05.08.2013 17:12

А порядка и не будет, тем более с такой маленькой разницей в весе. Там слишком много факторов влияют, особенно в сети (да и при чтении с диска есть моменты))). Если важен порядок, надо использовать последовательную, а не параллельную загрузку (то есть грузить в один лоадер, каждую следующую загрузку начинать только после завершения предыдущей).
Локальная переменная — да, я имел в виду ее. Обратите внимание, ссылка опять вроде бы нигде не сохраняется. Возможно, у работающих Лоадеров просто иммунитет — честно, не задавался этим вопросом.

Fogflasher 05.08.2013 17:37

У Мука в книге кстати был не Event.Complete, а Event.Init, там правда один файл грузился.
Может имунны лоадеры у которых комплит, а у которых инит нет, но это надо отдельно смотреть.

Ок, понятно. Заносим "последовательная загрузка" в ToDo List.

Котейка 05.08.2013 17:44

Цитата:

Хотя некоторые сомнения всё-таки остаются.
Например, если сборщик мусора сжирает первые две инициации initListener, тогда, вроде как и эта строка
Код AS3:

BitData = Bitmap(e.currentTarget.content).bitmapData;

не должна помогать, потому что двое первых e.currentTarget.content уже были "сожраны лангоньерами".
Вы не поняли в чем фишка. Вы сами каждую итерацию цикла перезаписываете переменную imageLoader на новую, так что в конце цикла она хранит ссылку на третий объект. Загрузка файлов работает асинхронно, она не задерживает остальной ход работы программы. Вот и получается что у вас работает так:
Код:

>Цикл отработал initListener == ссылке на последний лоадер. Загрузки начались.
>>... прошел некий отрезок времени
>Файлы загрузились.

Цитата:

Я протестировал - оба варианта работают.
Оба и будут, но в случае с глобальной приватной переменной у вас остается лишняя ссылка на последний лоадер.

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

Fogflasher 06.08.2013 11:30

Котейка, извиняюсь что туплю, но главу Мука я еще не перечитывал, поэтому...

Цитата:

Цикл отработал initListener == ссылке на последний лоадер. Загрузки начались.
Если это так, то вот этот багфикс от Wolsh: e.currentTarget.content тоже тогда не должен работать!
Ведь currentTarget.content всегда равен ссылке на последний лоадер, и всё равно должна только третья картинка отображаться : )
Как же тогда currentTarget получает различные значения?

Цитата:

P.P.S. Если по хорошему, то в вашем случае глобальная переменная класса нужна только одна - массив со ссылками на загруженные картинки. (у вас PicArray)
Мм, что значит глобальная переменная класса, вы наверное имеете ввиду, что:
Код AS3:

            private var imageCounter:uint = 0; //убрать под шконку
                        private var imageLoader:Loader;  //убрать под шконку
 
                        private var BitData:BitmapData;  //убрать под шконку
                        private var BitItem:Bitmap;        //убрать под шконку
 
                        private var _picArray:Array; //сделать public, а не private
 
                        ...

Хотя, что это меняет, в чем заключается "по хорошему" при такой реализации, не очень понятно.

Wolsh 06.08.2013 13:38

Цитата:

Ведь currentTarget.content всегда равен ссылке на последний лоадер
Это ссылка на экземпляр Лоадера, пославший данное конкретное Событие, а никак не на локальную переменную, хранящую ссылку на лоадер (которой к тому времени и в этом месте вообще не может быть, на то она и локальная, что существует/видна только локально в той функции, в которой была объявлена, и существует только ту сотую миллисекунды, пока отрабатывает функция).

Fogflasher 06.08.2013 14:23

Цитата:

Это ссылка на экземпляр Лоадера
Ах, вот оно что.
То есть три экземпляра сгенерились, переменная исчезла, а они висят в воздухе.
Я всё забываю, что и такие эфемерные классы как лоадер всё-таки имеют осязаемые экземпляры, а не фантомную абстрактную муть.

Цитата:

(которой к тому времени и в этом месте вообще не может быть, на то она и локальная, что существует/видна только локально в той функции, в которой была объявлена, и существует только ту сотую миллисекунды, пока отрабатывает функция).
Ну в первоначальной версии переменная же объявлена как свойство класса, пусть и private, то есть, если я правильно помню главу про scope, она видна внутри всех функций этого класса.

Котейка 06.08.2013 16:31

Цитата:

Сообщение от Fogflasher (Сообщение 1142774)
Мм, что значит глобальная переменная класса, вы наверное имеете ввиду, что:
Код AS3:

            private var imageCounter:uint = 0; //убрать под шконку
                        private var imageLoader:Loader;  //убрать под шконку
 
                        private var BitData:BitmapData;  //убрать под шконку
                        private var BitItem:Bitmap;        //убрать под шконку
 
                        private var _picArray:Array; //сделать public, а не private
 
                        ...

Хотя, что это меняет, в чем заключается "по хорошему" при такой реализации, не очень понятно.

Это меняет то что не будет пресловутого счетчика и лишних ссылок. На последние лоадер и битмапу. А чем меньше ссылок - тем меньше вероятность того, что вы забудете про нее при удалении объекта. А сделать свойство паблик, а не приват я не имел ввиду, упаси боже :D
Вот так как-то:
Код AS3:

package 
{
        import flash.display.Bitmap;
        import flash.display.Loader;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.net.URLRequest;
 
        public class ImageArrayLoader extends Sprite
        {
                public static const ALL_LOADED:String = "all_loaded";
                private static const LOADINGS_COUNT:int = 3;
                private var _images:Vector.<Bitmap>;
 
                public function ImageArrayLoader():void
                {
                        _images = new Vector.<Bitmap>;
                        addEventListener(ALL_LOADED, addToScreen);
                        for (var i:int = 1; i <= LOADINGS_COUNT; i++)
                        {
                                var loader:Loader = new Loader();
                                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadedItem);
                                loader.load(new URLRequest("text" + i.toString() + ".png"));
                        }
                }
 
                private function loadedItem(e:Event):void
                {
                        e.currentTarget.removeEventListener(Event.COMPLETE, loadedItem);
                        _images.push(e.currentTarget.content as Bitmap);
                        if (_images.length >= LOADINGS_COUNT) dispatchEvent(new Event(ALL_LOADED));
                }
 
                private function addToScreen(e:Event):void
                {
                        removeEventListener(ALL_LOADED, addToScreen);
                        for (var i:int = 0; i < _images.length; i++)
                        {
                                _images[i].x = i * 10;
                                _images[i].y = i * 30;
                                addChild(_images[i]);
                        }
                }
        }
}

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

Wolsh 06.08.2013 16:53

Цитата:

Ну в первоначальной версии переменная же объявлена как свойство класса, пусть и private, то есть, если я правильно помню главу про scope, она видна внутри всех функций этого класса.
Верно. Только вот ссылок на переменные не бывает))) Ссылка указывает на объект в памяти. Переменные хранят эти ссылки (или в случае простых типов String и Number — само значение, строку или число). Переменные не являются объектами, и ссылаться на них невозможно. То есть Event#currentTarget никак не может ссылаться на переменную imageLoader, которая ссылается на последний лоадер (или на что-то другое? она же переменная!).

namespaces 07.08.2013 05:35

Хочу обратиться к автору, а не проще ли использовать либу LoaderMax и готовый класс ImageLoader, и не возиться с этими бубнами.

Fogflasher 07.08.2013 15:21

Котейка, большое спасибо за готовый код! Правда при компилляции во Flash CS3 он выдает ошибку:
Цитата:

1084: Syntax error: expecting identifier before lessthan. private var _images:Vector.<Bitmap>;
Я не знаю что это за Векторы, у Мука вроде небыло такого. Может это уже специфика Флэш Девелопера?
Код интересный, я почти всё понял. Смущает, разве что, строка где находится
Цитата:

dispatchEvent(new Event(ALL_LOADED));
Чисто технически понятно, что она вызывает функцию addToScreen, но какбы интересно как можно додуматься до такого финта (с опытом перечитывания главы про события наверное приходит : )

Wolsh, ценное замечание, вот как раз такие простые базовые вещи и остаются неосмысленными подчас.
Я чисто автоматически предполагал, что всё в конечном счете является объектом и сводится к классу Object, например.
Хотя конкретно о переменных не задумывался в этом контексте.

Цитата:

Сообщение от namespaces (Сообщение 1142852)
Хочу обратиться к автору, а не проще ли использовать либу LoaderMax и готовый класс ImageLoader, и не возиться с этими бубнами.

Могу предположить, что да : ) Но, я вообще новичок в AS3.0, и даже не знаю, как это делается.
Не могли бы вы рассказать чуть подробнее, где взять эту библиотеку и как ее интегрировать в проект (или может в сам флэш)?

Akopalipsis 07.08.2013 16:19

Цитата:

Но, я вообще новичок в AS3.0, и даже не знаю, как это делается.
Если Вы хотите учится, то не нужно не каких библиотек! Вот когда Вы поймёте, что сами уже во всё разбираетесь хотя бы процентов на пятьдесят, вот тогда скачивайте, несколько дней учите и проверяйте весь код, а уже потом решайте - использовать всё или написать самому по такому же принципу.

Добавлено через 24 минуты
Когда решите сами сделать какой нибудь хороший и как это называется универсальный загрузчик, то вернитесь в эту тему и изучите вот этот загрузчик https://github.com/arthur-debert/BulkLoader . Мне эта ссылка очень пригодилась.

Котейка 07.08.2013 17:01

Fogflasher дело в том, что Flash CS3 компилит под 9й плеер, а вектора появились только в 10м :) Его можно заменить на обычный массив, будет все так же. Вектора просто работают чуть по-шустрее за счет заранее известного типа их содержимого.
Цитата:

Чисто технически понятно, что она вызывает функцию addToScreen, но какбы интересно как можно додуматься до такого финта
Ну на самом деле это никакой не финт, рассылка события это очень часто употребимая операция. :)
Что касательно LoaderMax. Это либа зеленых носков http://www.greensock.com/loadermax/ там у них еще много интересного есть. Но как правильно заметил Akopalipsis не нужно библиотек, если вы хотите учиться.

Akopalipsis 07.08.2013 17:02

Котейка а он бесплатный?)

namespaces 07.08.2013 19:24

Цитата:

Сообщение от Fogflasher (Сообщение 1142904)
Но, я вообще новичок в AS3.0, и даже не знаю, как это делается.
Не могли бы вы рассказать чуть подробнее, где взять эту библиотеку и как ее интегрировать в проект (или может в сам флэш)?

Там все просто. Перейдите сюда, скачайте либу, на правой стороне Download AS3. Пройдитесь по страничке, там очень много полезных примеров.
Не побоюсь сказать, что TweenMax для флеша как стандарт де факто, либа которая должна быть у всех по умолчанию. Иначе о какой либо продуктивности и удобности речи не может быть.

Цитата:

Сообщение от Akopalipsis (Сообщение 1142915)
Когда решите сами сделать какой нибудь хороший и как это называется универсальный загрузчик, то вернитесь в эту тему и изучите вот этот загрузчик https://github.com/arthur-debert/BulkLoader . Мне эта ссылка очень пригодилась.

Ваш универсальный мега загрузчик последний раз обновлялся в июне 2009 го года)

Котейка 07.08.2013 19:34

Akopalipsis, бесплатный для некоммерческого использования)

Akopalipsis 07.08.2013 19:35

Цитата:

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

Котейка 07.08.2013 22:39

okouser, это уже другая история) Я только отвечал на прямой вопрос о бесплатности либы.
Платить за лицензию или нет в данном случае больше вопрос совести, чем возможность судебного преследования. Здесь слишком много факторов, которые делают второе буквально невозможным.

namespaces 07.08.2013 23:47

Цитата:

Сообщение от Akopalipsis (Сообщение 1142947)
я читал на этом форуме, что он только в ознакомительных целях бесплатный.

http://www.greensock.com/licensing/
Usage in 100% free apps, games, sites, and other software even if you charge a fee to develop these products
Имеется ввиду использования только в 100% бесплатных приложениях, и в других приложениях где вам платят за вашу работу.
И в самой лицензии говориться, если ваше приложение приносит прибыль позволяющий купить лицензию, то вы должны купить у нас. В любом случае наши бонусные плагины для участников клуба, при монетизации приложения делают ее работу намного быстрее и эффективнее. Это все окупается и т.д.

От себя могу сказать, мне нравиться исходники от GreenSock. Все полностью документировано, комментировано и легко читается. Чего только там нет, они совместили все и вся для разработчика.

Akopalipsis 07.08.2013 23:54

namespaces Полностью с Вами согласен, да и примеры на загрузку цп там тоже убедительные. И я считаю, что и если правда на этом зарабатывать, то не стоит жалеть денег и честно купить.

Fogflasher 08.08.2013 17:28

Akopalipsis, да, я пока и ориентируюсь на освоение базовых вещей. Нужно хотя бы преобрести некоторый опыт персональнх разработок в различных сферах, и уже потом юзать крутые сторонние решения. Тем не менее спасибо за наводку на BulkLoader, беру на заметку.
(Оффтоп: а как вы ники белым цветом делаете, это функция форума, или вручную просто?)

Котейка, заменил Vector на Array, теперь всё работает.
Правда порядок вывода файлов прежний и странный: 3-ий, 1-ый, 2-ой : )

namespaces, благодарю за наводку на greensocks, хотя о классе TweenLite мне уже приходилось слышать в лекции от Тода Перкинса, он тоже советовал это решение.

Я скачал эту либу, немножечко пробежался по файлам. Пара вопросов:
1. Насколько я понял, эта либа содержит вообще все решения от гринсок? Ну то есть там есть и полноценный ТвинМакс и все прочие.

2. Можно ли тупо скопировать файл LoaderMax.as в папку со своим проектом, и там создавать его инстанции.
Или же, все эти классы завязаны в некую единую библиотечную целостность, и нужно непременно грузить в каждый проект всю библиотеку.

Akopalipsis 08.08.2013 17:44

Цитата:

2. Можно ли тупо скопировать файл LoaderMax.as в папку со своим проектом, и там создавать его инстанции.
Вы этот класс откройте и посмотрите на его импорт. Если есть нестандартные классы, то их тоже все нужно импортировать. Вообще вроде даже если все библиотеку подключить, то флеш все равно возьмет только нужное, ну и ещё чуток возможно прихватит.
Fogflasher это просто выбор цвета. И на первый вопрос - не знаю что вы качали, но вроде там сразу всё и max и lite.

namespaces 08.08.2013 18:46

Цитата:

Сообщение от Fogflasher (Сообщение 1143027)
1. Насколько я понял, эта либа содержит вообще все решения от гринсок? Ну то есть там есть и полноценный ТвинМакс и все прочие.

2. Можно ли тупо скопировать файл LoaderMax.as в папку со своим проектом, и там создавать его инстанции.
Или же, все эти классы завязаны в некую единую библиотечную целостность, и нужно непременно грузить в каждый проект всю библиотеку.

Конечно, три в одном.

Правильно, можно по всякому. Компилятор по любому оптимизирует вложенные классы и оставляет то что необходимо для импорта в SWF. Так или иначе для новичка требуется установить все ссылки через звездочку, чтоб можно было выбрать подходящий класс для данного случая.
Если даже считается плохим тоном импортировать всю либу со всеми его подклассами, это может повлиять лишь на скорость компиляции и не более. То есть пока компилятор будет производить поиск по ссылкам в кеше. Но в само приложение включаются только те классы на которые присутствуют ссылки. Аналогично тому как работает GC.

Babylon 11.08.2013 14:50

Ну еще суффиксы есть для переменных ..._cуффикс


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

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