Форум 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=206636)

Akopalipsis 16.02.2014 01:31

Создание собственных метатегов
 
Вроде и flex, но мне же нужно использовать во flash... В общем сорри, я правда не знаю к какому разделу относится этот вопрос.
В гугле нашёл старую тему - Пользовательские мета-теги и то что она старая и побудило меня задать этот вопрос.
Как создать собственный метатег?
Код AS3:

[метка]
public var vars:Type;

Прошло столько уже лет, что возможно во FD создать его стало намного проще.
Поделитесь ссылками, советами, чем сможете. И ещё раз простите за раздел.

Добавлено через 1 час 7 минут
Что-то мне подсказало, что нужно попробовать просто написать тэг и о чудо, изменения за пять лет в чудо FD на лицо:)

alatar 16.02.2014 20:54

Статья актуальна.
Цитата:

Прошло столько уже лет, что возможно во FD создать его стало намного проще.
Куда еще проще?
Основной смысл: прописать метатег в опциях компилятора, потом в рантайме получить данные о нем в выводе describeType.

Akopalipsis 16.02.2014 21:06

Цитата:

Куда еще проще?
Проще имелось ввиду, без компиляции swc. Возможно в FD появилась опция, какое-то окно, где можно прописать тоже самое, без bat файла. swc и ant у меня пока в будущем, но я скачал плагин для FD-swc, но там такое нельзя.
И у меня ещё вопрос - рантайме, это когда уже флеш скомпилирована в релизе?
У меня задача была, собрать данные для однотипных свойств во время компиляции и помогло просто написать тэг [Метка], чтобы собрать данные. Но так я понял в скомпилированной swf без внедрения swc не получится? Неужели нужно бат файлы чтобы прописать в компиляторе тег?

alatar 16.02.2014 21:13

Нет, bat-файлы не нужны, параметр прописывается в опции компилятора (сейчас FD под рукой нет, так что посмотрите самостоятельно, как это делается именно в нем).
swc создавать не обязательно.
В рантайме это значит — когда программа исполняется.
Поясните вашу задачу, что вы подразумеваете под "собрать данные для однотипных свойств во время компиляции"?

Akopalipsis 16.02.2014 21:29

Делаю скинирование и в полях класса, описывающего тему оформления, есть много свойств, типа - button_default_up и т.п. И чтобы при смени самой темы оформления всем этим свойствам с типом BitmapData вызывать dispose, нужно собрать все имена этих свойств, а так же ещё они при смене координат верстки нужны. Вот я и пишу у всех таких свойств [BMD][Coord] и потом через describeType загоняю имена в массивы Vector<String>.

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

сейчас FD под рукой нет, так что посмотрите самостоятельно, как это делается именно в нем
Если кто-то знает как, подскажите. я вчера весь вечер и до самого утра не мог не найти не нагуглить.

alatar 16.02.2014 21:32

Ну так это же не во время компиляции.

Akopalipsis 16.02.2014 21:44

Цитата:

Ну так это же не во время компиляции.
Возможно, но у меня исключительный случай:)
я собираюсь этим пользоваться, исключительно только при компиляции, так-как describeType видит только pablic свойства, а я не хочу делать их pablic. Вот и получается, что мне нужно только собрать имена, а потом я теги удалю и свойства в protected исправлю. Мне почему-то не нравится идея с xml описанием и изменением тем, это затратно. Мне показалось лучшим вариантом описывать темы, как классы, а потом в массив байт их помещать и при смене использовать классы не как Object, а как типизированный класс. Может и сумашествие, но пока так хочу поучится.
Мне самое главное, что работает без внесения каких либо изменений, просто тег достаточно прописать.
Спасибо Вам за объяснения.

alatar 17.02.2014 13:36

Можете воспользоваться as3-commons-bytecode. С этой библиотекой у вас будет гораздо больше возможностей, чем с describeType.

silin 17.02.2014 14:28

>>Вот я и пишу у всех таких свойств [BMD][Coord] и потом через describeType загоняю имена в массивы Vector<String>.

как вариант можно именовать их с соответствующими суффиксами (bmd_prop, coord_prop) с тем же результатом, но не связываясь с метатегами

>>Если кто-то знает как, подскажите. я вчера весь вечер и до самого утра не мог не найти не нагуглить.

это опция -keep-as3-metadata=<имя метатега>
добавить можно в Project Properties > Compiler Options > Additional Compiler Options

alatar 17.02.2014 14:31

Цитата:

Сообщение от silin (Сообщение 1160142)
как вариант можно именовать их с соответствующими суффиксами (bmd_prop, coord_prop) с тем же результатом, но не связываясь с метатегами

Проще тип посмотреть, раз уж свойства определенного типа обрабатываются.

Akopalipsis 17.02.2014 15:00

Цитата:

добавить можно в Project Properties > Compiler Options > Additional Compiler Options
Спасибо! Самостоятельно я тоже смотрел, но не рискнул вводить команду, так-как даже в гугле не смог найти подтверждение, что именно туда нужно вводить.

Dukobpa3 20.02.2014 14:35

Погоди, дружочек.
Метатеги тебе особо ниче не дадут. Только сэкономят кол-во кода(который ты пишешь руками, он то все-равно останется, но будет скрыт немного глубже).

Всё чего ты ждешь от метатегов - ты можешь получить и без них, но с большим кол-вом кода.
Я бы рекомендовал сначала проработать свою архитектуру без них. Когда сформируется костяк кода - будет понятно какие части архитектуры ты захочешь/сможешь заменить тегами.
Но без метатегов придется пойти на некоторые минимальные жертвы, типа сделать вместо привата интернал или протектед и в таком духе. Возможно свой неймспейс добавить.

Akopalipsis 20.02.2014 15:27

Цитата:

Метатеги тебе особо ниче не дадут.
Полностью согласен. Просто я делаю классы с описанием свойств, которых не так мало и они постоянно меняются, из-за того, что я ищу лучший вариант. Всё что мне нужно получить, это массив с именами свойств и методов в порядке их объявления и значение метод это или свойство. Лень переписывать массивы привела меня к метатегам, но а потом я и от них отказался и сделал вот так -
Код AS3:

public static function classArray(object:Object, array:Array, isReverse:Boolean=true):void
                {
                        var xmlList:XMLList = describeType(object).children();
                        const VARIABLE:String = "variable";
                        const METHOD:String = "method";
                        var names:Array = [];
                        var commands:Array = [];
                        for each(var item:Object in xmlList)
                        {
                                var type:String = item.name();
                                if (type == VARIABLE)
                                {
                                        names.push(item.attribute('name'));
                                        commands.push(true);
                                }else if (type == METHOD)
                                {
                                        names.push(item.attribute('name'));
                                        commands.push(false);
                                }
                        }
 
                        if (isReverse)
                        {
                                names.reverse();
                                commands.reverse();
                        }
                        composeString(array[0], array[1], names);
                        composeString(array[2], array[3], commands);
                }
                private static function composeString(name:String, type:String, array:Array):void
                {
                        var length:int = array.length;
                        var row:String = 'public static const ' + name + ':Vector.<' + type + '> = new <' + type + '>[';
                        for (var i:int = 0; i < length; i++)
                        {
                                row += array[i] + ', ';
                        }
                        row = row.substr(0, row.length - 2) + '];';
                        trace(row);
                }
 
        }

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

Dukobpa3 20.02.2014 15:42

Цитата:

в жизни неймспесы
Когда поймешь как пользоваться - не замедляют, но поначалу путаница будет.
Но до того как браться за неймспейсы надо понять юзкейсы интернала. Во многом он спасает, хотя его польза и неочевидна.

Ну и одна из плюшек кастомных неймспейсов это некий аналог перегрузки методов. Можно вытанцевать с бубном себе методы с одинаковыми именами в разных неймспейсах.

Akopalipsis 20.02.2014 15:50

Dukobpa3 Спасибо!


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

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