PDA

Просмотр полной версии : Зачем нужен getDefinitionByName?


Universe
18.02.2011, 16:28
Никак не могу врубиться, зачем использовать getDefinitionByName. Может кто-то подсказать примеры его реального использования и в чём собственно преимущества? Потому что насколько я понимаю он позволяет взять класс по имени. Но я же могу просто обратиться к этому имени и точно также создать его без getDefinitionByName вот таким образом:
Допустим что у нас есть 3 объекта в библиотеке к которым нам надо обратиться до их создания(т.е. к именам их классов).

var pieces2:Array = [Piece1,Piece2,Piece3];
var pieceIndex:uint;


for(var i:uint; i<pieces2.length; i++)
if(pieceIndex < pieces2.length)
{
trace(pieces2[i]);
pieceIndex++;
}

КорДум
18.02.2011, 16:35
Есть у кодера Василия в библиотеке 500 шариков. Он не знает, что взрослые дяди ему бы понадавали по рукам за такой несколько нерациональный подход к шарикам, когда их можно было сделать, например, просто в клипе, а потом вытащить getChildByName, чем плодить 500 классов. Но вот он сделал, а дяди далеко. И хочется ему в цикле создать на сцене сразу все 500 разных шариков. Василий специально давал идентичные имена классам. И вот он взмахом своей кодерской руки пишет:
for (var i:int = 1; i <= 500; i++) addChild(getDefinitionByName("Ball" + i) as MovieClip);
То есть, если есть у вас в библиотеке идентичные названия классов и есть у вас же необходимость дергать эти классы, вернее их экземпляры, на сцену, то вот он подход ;)

gloomyBrain
18.02.2011, 16:40
я же могу просто обратиться к этому имени и точно также создать его без getDefinitionByName

Есть главный swf файл. Он грузит в себя еще один swf файл с пачкой анимаций. Эти анимации могут меняться (допустим, ко дню святого Валентина), а имена классов - нет. Таким образом главный swf не содержит в себе этих классов во время компиляции, а "выковыривает" их из загруженного. Это можно использовать для того, чтобы главный файл лежал в кеше браузера, а загружаемый, по необходимости, грузился заново.
В случае, если все будет в одном swf файле, если вы поменяете анимации пользователю придется заново грузить все приложение

Zebestov
18.02.2011, 18:13
А еще один из стандартных прелоадеров не будет работать =)

Universe
18.02.2011, 18:53
я же могу просто обратиться к этому имени и точно также создать его без getDefinitionByName
Есть главный swf файл. Он грузит в себя еще один swf файл с пачкой анимаций. Эти анимации могут меняться (допустим, ко дню святого Валентина), а имена классов - нет. Таким образом главный swf не содержит в себе этих классов во время компиляции, а "выковыривает" их из загруженного. Это можно использовать для того, чтобы главный файл лежал в кеше браузера, а загружаемый, по необходимости, грузился заново.
В случае, если все будет в одном swf файле, если вы поменяете анимации пользователю придется заново грузить все приложение
а...ну в целом понятно...т.е. работать оно не будет только если вот такая специфическая ситуация - т.е. самих классов нет в главной свф'ке...или....
for (var i:int = 1; i <= 500; i++) addChild(getDefinitionByName("Ball" + i) as MovieClip);
в цикле надо создать и вытянуть объекты на сцену. Но вот в этом примере с циклом, можно сделать и без getDefinitionByName но тогда надо будет создать массив со ссылками на эти классы по типу
my_arr = [ball1, ball2, ball3]
Так получается?

Zebestov
18.02.2011, 19:00
Вообще-то твой вопрос стоял в самом широком смысле. Не нужно теперь стягивать его с глобуса и говорить про твой конкретный пример ;)

PHILOSOFF
18.02.2011, 19:01
for (var i:int = 1; i <= 500; i++) addChild(getDefinitionByName("Ball" + i) as MovieClip);


У меня такая штука почему то не прокатила.

Только вот так:
var i:int = 1;
var mc1Class:* = getDefinitionByName('mc' + i);
var mc1:Sprite = new mc1Class();
addChild(mc1);

Если написать getDefinitionByName("mc" + i) as MovieClip // или "as Sprite"
тогда возвращает null

-De-
18.02.2011, 19:04
У меня есть хренова куча текстур. Модели к ним обращаются по именам - имя текстуры надо прописать. Если бы не getDefinitionByName, то два раза. Ну можно сделать то же, но наоборот, через getQualifiedClassName, наверное)

Bgg
18.02.2011, 19:08
PHILOSOFF, getDefinitionByName возвращает ссылку на класс, а не на экземпляр класса. Добавить класс в список отображения нельзя.

gloomyBrain
18.02.2011, 19:13
var mc1Class:Class = getDefinitionByName('mc' + i) as Class;
var mc1:Sprite = new mc1Class() as Sprite // MovieClip;

Dima_DPE
18.02.2011, 19:54
getDefinitionByName нужен и очень часто, это часть reflection api которая так слабо развита во флеше. Самый явный пример когда он нужен, это случай с прелоадером в два кадра при компиляции c помощью flex sdk, когда запуск главного приложения во втором кадре идет именно как

stage.addChild(new (getDefinitionByName("com.company.Main"))() as DisplayObject);
Масса примеров с массивом текстур в библиотеке предложены выше, а об загрузки внешних модулей/библиотек и использовании их в качестве библиотек я и вовсе промолчу.
Еще интересный пример использования getDefinitionByName, это поиск класса родителя объекта, т.к. имя класса родителя можно получить только в виде строки.

Одно могу сказать точно, если вы не можете придумать зачем вам getDefinitionByName, это значит что лично вам он пока не нужен.

КорДум
18.02.2011, 20:52
new пропустил по невнимательности.

Universe
18.02.2011, 21:26
У меня есть хренова куча текстур. Модели к ним обращаются по именам - имя текстуры надо прописать. Если бы не getDefinitionByName, то два раза. Ну можно сделать то же, но наоборот, через getQualifiedClassName, наверное)
Немного не понял, о чём это вы. Но данная фраза меня натолкнула на резонный вопрос: если в библиотеке есть хренова куча текстур, есть ли способ как то автоматизировать процесс присвоения им имён класса? Или лучше не забивать себе дурным голову и делать это через xml или просто формировать через цикл путь к файлу на HD?
А что такое getQualifiedClassName?:)

samana
19.02.2011, 00:14
А что такое getQualifiedClassName?
Больше можно увидеть здесь (http://help.adobe.com/ru_RU/AS3LCR/Flash_10.0/flash/utils/package-detail.html).