Форум 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 (приватные переменные начинаются с подчеркивания и с маленькой)


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

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