Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Объект не сохраняется в массиве (http://www.flasher.ru/forum/showthread.php?t=182775)

friendrix 02.08.2012 16:57

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

Код AS3:

var items=[item1,item2,item3];
trace(items[0],item1); // результат: null [object SimpleButton]

Т.е. к объекту по имени я могу обратиться, а поместить в массив нет. Почему? Есть ли альтернатива?

GBee 02.08.2012 17:07

А где массив-то?

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

friendrix 02.08.2012 17:12

массив items, можно так написать, результат тот же-
Код AS3:

var items:Array=[item1,item2,item3];


GBee 02.08.2012 17:30

Код 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);

У меня все ок, покажите весь код.

friendrix 02.08.2012 17:40

Вложений: 1
Собственно это и весь код:

Код 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.

expl 02.08.2012 17:42

Цитата:

Т.е. к объекту по имени я могу обратиться, а поместить в массив нет. Почему? Есть ли альтернатива?
Так быть не должно, варианты:
- Вы чего-то не допоказали
- бага компилятора - нужно попробовать написать этот код в другой функции или другим способом
- ошибка кеширования, по-крайней мере при компиляции во FlashBuilder такие появляются время от времени
Код AS3:

Если есть возможность посмотреть сцену, прикладываю исходник, в CS5.

Возможности нет.
Переместите items=[item1,item2] в конструктор. Инициализации полей по месту может происходить в неадекватном порядке (хотя именно такой код какой вы привели всегда работал нормально - грешить остаётся только на этот порядок и на 3 вышеприведённых пункта)

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

Aquahawk 02.08.2012 17:58

Цитата:

Переместите items=[item1,item2] в конструктор. Инициализации полей по месту может происходить в неадекватном порядке (хотя именно такой код какой вы привели всегда работал нормально - грешить остаётся только на этот порядок и на 3 вышеприведённых пункта)
Хотел бы оспорить данное утвержение, порядок известен и описан в AVM 2 overview и наблюдаем при разборе флешки. Для полей простых типов (числа, строки) инициализация произойдёт до вызова конструктора т.к. эти значения будут сохранены в таблице ностант. Все поля объекта сложных типов будут инициализированы в конструкторе в самом начале, перед вышим кодом. Код их инициализирующий окажется в конструкторе. Можно проверить это при помощи моего любимого rabcdasm. Таким образом можно считать что вся подобная инициализация происходит в конструкторе перед нашим кодом. Возможно что это произойдёт до вызова super(); этого я уже не помню. В данном случае значения не имеет. В случае статических полей произойдёт абсолютно также за исключением того что инициализация произойдёт не в сонструкторе, а в статическом инициализаторе (cinit) и произойдёт это при первом упоминании класса в коде в любом виде.

friendrix 02.08.2012 18:10

Поместил items=[item1,item2] в конструктор, заработало.
Видимо действительно дело в порядке инициализации.

gloomyBrain 02.08.2012 18:12

А мне что-то подсказывает, что до первого собтия 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);
 
                }
        }
 
}


Aquahawk 02.08.2012 18:43

я понял что произошло, может и напишу подробный разбор полётов с тем что произошло позже. Тут действительно дело в порядке инициализации, но всё несколько интереснее


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

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