Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Стейты у SimpleButton. (http://www.flasher.ru/forum/showthread.php?t=138948)

tofflife 19.04.2010 19:32

Стейты у SimpleButton.
 
Здравствуйте. Объясните пожалуйста мне, тупице, следующие вопросы.

1. Предположим, у меня имеется некий SimpleButton, зашитый в FLA и с линкованный через Linkage.

Вот как я их создаю(упрощенно):

Код AS3:

var newButton:SimpleButton = new MyButton();//Создаемся
var copyButton:SimpleButton = new (Object(newButton)).constructor();//Клонируем.

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

2. Я наткнулся на то, что мне нужно загружать кнопки извне. Я стал загружать спрайты и записывайть их в стейты, вот так:

Код AS3:

myButton.onUpState = loaderInfo.loader.content;

все ок, все шуршит и пашит. Но потом мне эти кнопке также понадобилось клонировать. К сожалению, первый вариант уже не катит, поскольку во втором случае уже используется не MyButton, описанный в FLA, а базовый SimpleButton и он не знает изначально, что у него внутри.

Поставил вот такой костыль:

copy.upState = new (Object(myButton.upState)).constructor()

Гы. Работает. Но первый вариант перестал работать с этой строчкой.
Стал рыться в отладчике. Может ещё что-нибудь сетать надо? Смотрю, у copy.upState есть свойство parent, равное самому myButton(т.е. хозяин у контрола остался тот же)

3. Я фшоке. Какие образом просетать в это поле(parent), если оно read-only, да ещё плюс к тому SimpleButton не является контейнером!

Что вы думаете по всему вышеописанному.

Gaen 19.04.2010 20:08

Я думаю, что вы занимаетесь не тем, ибо прототипирование - это пережитки AS1, а в AS3 все визуальные объекты создаются по-нормальному, а не клонированием. Именно потому, что попытка клонирования вызывает проблемы, которые вы здесь описываете.

tofflife 19.04.2010 20:18

у меня нет прототипирования. у меня создаются все объекты через рефлексию вообще через getDefinitionByName.
Вот пример описания контрола:

<BankChestStrokeEvidence type="com.awem.visual.control.standart.impl.Image" owner="BankChest" resource="BankBandannaStrokeRes" x="25" y="3"/>

dimarik 20.04.2010 02:35

Код AS3:

var copyButton:SimpleButton = new (Object(newButton)).constructor();//Клонируем.

А это тогда... ммм к чему? Кривое "клонирование" через анус.

Код AS3:

var copyButton:SimpleButton = SimpleButton( new Object(newButton).constructor );// Вот клонируем, а не машем правой рукой.

Рефлексия, #@$%, у него.

Всю визуальную составляющую так не склонируете. getDefinition и далее по рефлексии.

tofflife 20.04.2010 13:50

К вашему сведению - getDefinitionByName и new (Object(newButton)).constructor()
работают по одному принципу.
Второй пример работает гораздо быстрее, поскольку отсуствуют затраты на получение полного имени ресурса.

"Всю визуальную составляющую так не склонируете."
Ошибаетесь. Класс полностью воссоздает начальное состояние картинки.

Хотя это я тут немного неправильно написал. Это, скорее, не клонирование текущего состояния объекта, а клонирование его начального состояния, описанного в FLA.

Добавлено через 4 минуты
var copyButton:SimpleButton = SimpleButton( new Object(newButton).constructor )

Ну и на кой ляд мне делать лишнее преобразование к SimpleButton, когда я могу вызвать напрямую конструктор, возвращающий SimpleButton?!

Psycho Tiger 20.04.2010 17:38

Ого, конструкторы уже возвращают что-то.. )

dimarik 22.04.2010 01:08

Надо тестить, Тигра. Вдруг что вернут.

2 tofflife
Фраза "Всю визуальную ....". Означала, что кроме шейпов, созданных в authority-mode, в DisplayObject/DisplayObjectContainer могут быть и детки по-серьезнее.

Добавлено через 1 минуту
Цитата:

Сообщение от tofflife (Сообщение 901931)
К вашему сведению - getDefinitionByName и new (Object(newButton)).constructor()

Ах, да! Я приму это к сведению, спасибо ))

Psycho Tiger 22.04.2010 10:21

Код AS3:

var tmp1:TestClass = new TestClass();
                        var tc:TestClass = tmp1["constructor"] as TestClass;
                        trace(tc);
                        var func:Function = tmp1["constructor"] as Function;
                        trace(func);
 
                        trace(tmp1["constructor"]);

null
null
[class TestClass]

Это не функция/метод и не класс. Судя по всему, это геттер, и что-то он возвращает. Похоже был не прав по поводу того, что конструктор ничего не возвращает...

Gaen 22.04.2010 17:34

Код AS3:

var tmp:TestClass = new TestClass();
trace(tmp["constructor"] as Class); // [class TestClass]

Риальне... Накинулись на человека, а он прав оказался, хоть и по-извратски)

Psycho Tiger 22.04.2010 20:18

Ну, конструктор по идее ничего возвращать и не должен - не это у него предназначение. Конструктор определяется как метод, в общем то говоря - а я вверху показал что это геттер. Значит, по сути дела конструктор класса и object.constructor это разные вещи. И вот object.constuctor что-то возвращает - судя по всему, экземпляр класса или сам класс
Код AS3:

trace(typeof tmp1["constructor"]);

//object
Но я почти уверен, что автор говоря о конструкторе имел ввиду именно тот самый конструктор, что метод.


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

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