Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.07.2013, 16:30
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 1  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
Tools 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() не нравится... Но что с ней не так?

Старый 30.07.2013, 16:36
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 2  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
На момент обращения к
Код AS3:
PicArray[i]
в массиве нет ни одного элемента - в AS3 этот процесс асинхронный.
Плюс ко всему лучше подписывать сам лоадер на Event.COMPLETE:
Код AS3:
imageLoader.addEventLsitener(Event.COMPLETE, initListener);
private function initListener (e:Event):void
{
...
}
И вызывать функцию ArrayDisplay либо после того как все картинки загрузятся, либо каждый раз передавая полученную картинку

Старый 30.07.2013, 17:06
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 3  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
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

Старый 30.07.2013, 17:11
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 4  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Добавляйте в массив с помощью .push();
Код AS3:
PicArray.push(BitItem);

Старый 30.07.2013, 17:28
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 5  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
Кхм, что-то не помогает.

Но, кстати, если код значительно упростить:
Код 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... что за ботва, непойму.

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

Старый 30.07.2013, 17:46
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 6  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
imageCounter надо увеличивать при загрузке картинки, а не в цикле, где вы только говорите программе загрузить картинки)

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

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

Старый 31.07.2013, 09:49
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 7  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
Переработал с учетом замечаний:

Код 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. Кстати, в подсветке форумных кодов, трэйс-кавычечные элементы можно было бы сделать своим цветом, ну например светло-коричневым.
А то сливается с кодом других команд, эргономичность ниже.


Последний раз редактировалось Fogflasher; 31.07.2013 в 10:08.
Старый 31.07.2013, 10:18
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 8  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
)) А то что вы глаголы Пишете с большой буквы, эргономичность не Снижает?
В AS3 только названия классов пишутся с большой буквы. Привыкайте сразу, потом будет тяжело перестраиваться.
__________________
Reality.getBounds(this);

Старый 31.07.2013, 11:02
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 9  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
Да не, яж не наезжаю, так чисто выразил соображение. Если по каким-то причинам этого нельзя - да пожалуйста.

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

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

Старый 31.07.2013, 13:48
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 10  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: 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, время: 03:31.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
array , loader as3 , загрузка , Изображения , массив
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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