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

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

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

Регистрация: Nov 2009
Адрес: SPb
Сообщений: 26
По умолчанию Объект не сохраняется в массиве

Друзья, такой вопрос.
В сцене имеются несколько объектов [SimpleButton] с именами (Instance Name) item1, item2, item3.
Все они упакованы в MovieClip с именем menu, которому назначен класс Menu.
В описании класса я пишу:

Код AS3:
var items=[item1,item2,item3];
trace(items[0],item1); // результат: null [object SimpleButton]
Т.е. к объекту по имени я могу обратиться, а поместить в массив нет. Почему? Есть ли альтернатива?

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

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
А где массив-то?

Добавлено через 2 минуты
Хотя без разницы, это ведь не весь код?
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

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

Регистрация: Nov 2009
Адрес: SPb
Сообщений: 26
массив items, можно так написать, результат тот же-
Код AS3:
var items:Array=[item1,item2,item3];

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

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Код AS3:
var item1:Sprite = new Sprite();
var item2:Sprite = new Sprite();
var item3:Sprite = new Sprite();
var items:Array = [item1, item2, item3];
trace(items[0], item1);
У меня все ок, покажите весь код.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

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

Регистрация: Nov 2009
Адрес: SPb
Сообщений: 26
Собственно это и весь код:

Код AS3:
package  {
	import flash.display.MovieClip;
 
	public class Menu extends MovieClip{
 
		var items:Array=[item1,item2]; 
 
		public function Menu(){
			// constructor code
			trace(items[0], item1);
		}
 
	}
 
}
Отличие в том, что вы создаете объекты динамически, а у меня они уже созданы в сцене.

Если есть возможность посмотреть сцену, прикладываю исходник, в CS5.
Вложения
Тип файла: rar test.rar (10.0 Кб, 26 просмотров)

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

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Т.е. к объекту по имени я могу обратиться, а поместить в массив нет. Почему? Есть ли альтернатива?
Так быть не должно, варианты:
- Вы чего-то не допоказали
- бага компилятора - нужно попробовать написать этот код в другой функции или другим способом
- ошибка кеширования, по-крайней мере при компиляции во FlashBuilder такие появляются время от времени
Код AS3:
Если есть возможность посмотреть сцену, прикладываю исходник, в CS5.
Возможности нет.
Переместите items=[item1,item2] в конструктор. Инициализации полей по месту может происходить в неадекватном порядке (хотя именно такой код какой вы привели всегда работал нормально - грешить остаётся только на этот порядок и на 3 вышеприведённых пункта)

Да даже не в порядке инициализации массива дело, а в том что в момент его инициализации полям item1 и item2 еще не присвоено значение.

Старый 02.08.2012, 17:58
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 7  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
Цитата:
Переместите items=[item1,item2] в конструктор. Инициализации полей по месту может происходить в неадекватном порядке (хотя именно такой код какой вы привели всегда работал нормально - грешить остаётся только на этот порядок и на 3 вышеприведённых пункта)
Хотел бы оспорить данное утвержение, порядок известен и описан в AVM 2 overview и наблюдаем при разборе флешки. Для полей простых типов (числа, строки) инициализация произойдёт до вызова конструктора т.к. эти значения будут сохранены в таблице ностант. Все поля объекта сложных типов будут инициализированы в конструкторе в самом начале, перед вышим кодом. Код их инициализирующий окажется в конструкторе. Можно проверить это при помощи моего любимого rabcdasm. Таким образом можно считать что вся подобная инициализация происходит в конструкторе перед нашим кодом. Возможно что это произойдёт до вызова super(); этого я уже не помню. В данном случае значения не имеет. В случае статических полей произойдёт абсолютно также за исключением того что инициализация произойдёт не в сонструкторе, а в статическом инициализаторе (cinit) и произойдёт это при первом упоминании класса в коде в любом виде.
__________________
:)

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

Регистрация: Nov 2009
Адрес: SPb
Сообщений: 26
Поместил items=[item1,item2] в конструктор, заработало.
Видимо действительно дело в порядке инициализации.

Старый 02.08.2012, 18:12
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 9  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
А мне что-то подсказывает, что до первого собтия FRAME_CONSTRUCTED никаких детей у меню не будет (и это, кстати, вполне логично).

Автор, попробуйте вот так:
Код AS3:
package  {
	import flash.display.MovieClip;
 
	public class Menu extends MovieClip{
 
		var items:Array=[item1,item2]; 
 
		public function Menu(){
 
			super();
			super.addEventListener(Event.FRAME_CONSTRUCTED, onFrameReady);
		}
 
		private function onFrameReady(event:Event){
			trace(items[0], item1);
 
		} 
	}
 
}
__________________
...вселенская грусть

Старый 02.08.2012, 18:43
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 10  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
я понял что произошло, может и напишу подробный разбор полётов с тем что произошло позже. Тут действительно дело в порядке инициализации, но всё несколько интереснее
__________________
:)

Создать новую тему Ответ Часовой пояс GMT +4, время: 09:23.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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