|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
Loader:Загрузка изображений в массив.
Пробую написать нуб-программу, которая бы грузила картинки в массив, а затем выводила их.
Получился вот такой код: 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]); } } } } Цитата:
|
|
|||||
На момент обращения к
в массиве нет ни одного элемента - в AS3 этот процесс асинхронный.
Плюс ко всему лучше подписывать сам лоадер на Event.COMPLETE: И вызывать функцию ArrayDisplay либо после того как все картинки загрузятся, либо каждый раз передавая полученную картинку |
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
KumoKairo, нда, действительно пишет undefined.
1. Исправил на EVENT.COMPLETE. 2. Меня интересует вариант "после того как все картинки загрузятся". Казалось бы, вот такой костыль должен решать: А нифига, трэйсы всё равно выдают: Цитата:
|
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
Кхм, что-то не помогает.
Но, кстати, если код значительно упростить: 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); } } } Цитата:
Может при выходе из цикла что-то происходит. |
|
|||||
imageCounter надо увеличивать при загрузке картинки, а не в цикле, где вы только говорите программе загрузить картинки)
У вас в конце цикла imageCounter сразу становится равным 2, и три загрузчика начинают трудиться над загрузкой изображений. И после загрузки каждого изображения в отдельности вызывается функция initListener() Поэтому первый вызов nitListener() произойдет "намного" позже окончания цикла |
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
Переработал с учетом замечаний:
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]); } } } } Теперь всё работает, спасибо ^_^ P.S. Кстати, в подсветке форумных кодов, трэйс-кавычечные элементы можно было бы сделать своим цветом, ну например светло-коричневым. А то сливается с кодом других команд, эргономичность ниже. Последний раз редактировалось Fogflasher; 31.07.2013 в 10:08. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
)) А то что вы глаголы Пишете с большой буквы, эргономичность не Снижает?
В AS3 только названия классов пишутся с большой буквы. Привыкайте сразу, потом будет тяжело перестраиваться.
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
Да не, яж не наезжаю, так чисто выразил соображение. Если по каким-то причинам этого нельзя - да пожалуйста.
А где я глаголы с большой буквы писал, что-то не припомню. Хотя наверное изредка бывает, да. Это наверное влияние викканских эманаций. Или может речь шла о переменных с большой букы? Это да, надо бороцца. И еще черточки всякие там проставлять перед ними наверное сразу нужно учиться. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
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 (приватные переменные начинаются с подчеркивания и с маленькой)
__________________
Reality.getBounds(this); |
Часовой пояс GMT +4, время: 04:46. |
|
« Предыдущая тема | Следующая тема » |
Теги |
array , loader as3 , загрузка , Изображения , массив |
|
|