Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ассоциирование символа вставляемого клипа с пользовательским классом средствами ant (http://www.flasher.ru/forum/showthread.php?t=113448)

LokiDi L0ck 29.06.2008 00:16

Ассоциирование символа вставляемого клипа с пользовательским классом средствами ant
 
1) Создаём в flash cs3 - Flash File.
Далее создаём символ (MovieClip), убираем его с Stage (оставляем только в библиотеке).
Щёлкаем правой кнопкой мыши по MovieClip'у, выбираем Linkage, вбиваем имя класса TestMovie (в base class: flash.display.MovieClip). Жмём ок.
Далее File -> Publish (сохраняем swf под именем MovieLib).
Закрываем flash cs3.

2) Открываем например fdt. Создаём проект. Чтобы ассоциировать свой класс с нужным нам символом, пишем:

Код:

[Embed(source="MovieLib.swf", symbol="TestMovie")]
public class MyTestMovie extends MovieClipAsset {}



Вопрос заключается в следующем. Можно ли включить MovieLib.swf в конечный swf проекта при этом указав, что символ TestMovie должен быть ассоциирован с таким то классом в проекте средствами ant?
Т.е. в итоге избавиться от тега Embed в коде самого класса.

В документации: http://livedocs.adobe.com/flex/3/html/ просмотрел разделы о компиляторах, их опциях, и flex ant. Ответа не нашёл.

silin 29.06.2008 13:53

не удобнее ли компилить MovieLib в SWC с уже нужным классом этого символа, и подключать этот swc как библиотеку, зачем обязательно вытягивать Embed'ом из swf ?

LokiDi L0ck 29.06.2008 14:29

Код:

зачем обязательно вытягивать Embed'ом из swf ?
Флэшер создаёт анимацию - библиотеку с символами movieclip'ов. После чего отдаёт swf кодеру.
Кодер же создаёт управление анимацией символов.

wvxvw 29.06.2008 14:31

Недавно тоже пытались с чем-то похожим разобраться. Я вобщем-то тоже за SWC, но логику понять можно - т.е. не хочется, чтобы дизайнер был зависим от программера (в случае с SWC дизайнеру для компиляции нужны классы связаные с его клипами, или, наоборот, програмеру прийдется компилировать SWC самому из Флеш ИДЕ) недостатки понятны. Единственное, что мне приходит в голову по этому поводу - использовать скинирование. Т.е. нигде не привязывать логику класса к графике. Т.е. самый простой случай: есть класс Кнопка: но он не привязан к клипу в библиотеке, просто при компиляции он вытаскивает из библиотеки 3 мувика "овер", "аут" и "пресс" и использует их для отображения разных состояний. Таким образом дизайнеру не нужен класс Кнопка и он может сам спокойно все скомпилировать, и програмеру не нужно компилировать графические библиотеки. Недостатки - лейауты прийдется делать програмеру (т.как у дизайнера не останется возможности визуально скомпоновать кнопки на форме - у него просто не будет "кнопки").

LokiDi L0ck 29.06.2008 14:41

wvxvw, не вижу проблем.
Дизайнер может нарисовать мувиклип кнопки, а далее на 4ёх кадрах придать ей разные формы и цвет. Каждому кадру приписать соответствующий label (например mouseover, mouseclick и т.д.).
Прогер же спокойно цепляет символ кнопки, например так:

Код:

[Embed(source="ButtonsLibrary.swf", symbol="MyButton")]
И потом описывает действия:

Код:

[Embed(source="ButtonsLibrary.swf", symbol="MyButton")]
class MyButton extends MovieClipAsset {
   
    //onMouseOverListener подписывается под события мыши
    private function onMouseOverListener(e : MouseEvent) {
        gotoAndStop("mouseover");
    }

    //и так далее
}

Единственная связь между дизайнером и прогером: дизайнер должен сообщить прогеру о именах label.


=============
В связи с чем меня и заинтересовало, можно ли обойтись без тега Embed и все подобные связи описать в build.xml.

wvxvw 29.06.2008 15:05

Читайте внимательнее: либо дизайнер не сможет расположить кнопки на форме (т.как то, что он выложит на форму не будет инстансом класса Кнопка - потому что программер назначил ему этот класс), либо ему нужен будет класс Кнопка, для того, чтобы он мог выложить на форму именно кнопку, а не клип из 3х кадров.

LokiDi L0ck 29.06.2008 15:14

Ок. Понял. Хотя и это можно обойти, в зависимости от требований проекта)

Что насчёт вопроса темы?)

fljot 29.06.2008 16:39

Цитата:

Сообщение от wvxvw (Сообщение 748614)
либо дизайнер не сможет расположить кнопки на форме (т.как то, что он выложит на форму не будет инстансом класса Кнопка - потому что программер назначил ему этот класс)

как раз может. например, дизайнер связывает кнопки с несуществующими классами Button1 & Button2 и кладёт их на форму с классом Form куда считает нужно. далее программер пишет
Код:

package
{       
        [Embed(source="library.swf", symbol="Button1")]
        public class Button1 extends FormButton {}
}
...
package
{       
        [Embed(source="library.swf", symbol="Button2")]
        public class Button2 extends FormButton {}
}

ну и класс формы аналогично. но в классе формы кнопки надо будет явно объявить, чтобы компилятор учёл вышеобозначенные классы кнопок. это вот например такой замут для "имитации" указания Base Class при компиляции в Flash IDE..

так что вопрос впринципе интересен)

wvxvw 29.06.2008 18:19

Хм... а разве Флеш не создаст автоматом класс Button1?

wvxvw 29.06.2008 21:21

ХМ... приду домой - попробую =)

LokiDi L0ck 29.06.2008 22:07

Обсуждение не соответствует вопросу темы. :confused:

silin 29.06.2008 22:52

Цитата:

Сообщение от LokiDi L0ck (Сообщение 748605)
Код:

зачем обязательно вытягивать Embed'ом из swf ?
Флэшер создаёт анимацию - библиотеку с символами movieclip'ов. После чего отдаёт swf кодеру.
Кодер же создаёт управление анимацией символов.

вот я как раз и не пойму почему эту библиотеку необходимо иметь именно в виде swf, почему не иметь ее в виде swc, избавившись от Embed и связанных с этим неудобствами..
что мешает флешеру отдать кодеру не swf, а swc ?

fljot 29.06.2008 22:56

silin, а как устроить code injection в swc?

LokiDi L0ck 29.06.2008 22:56

Код:

вот я как раз и не пойму почему
В данной теме от вас этого и не требуется :)

В общем модеры, можете прикрывать тему. Кроме флейма тут врядли что по вопросу будет.
Пойду рыть доки дальше, толку больше (как всегда).

lowka 29.06.2008 23:14

Цитата:

Сообщение от LokiDi L0ck (Сообщение 748560)
Вопрос заключается в следующем. Можно ли включить MovieLib.swf в конечный swf проекта при этом указав, что символ TestMovie должен быть ассоциирован с таким то классом в проекте средствами ant?
Т.е. в итоге избавиться от тега Embed в коде самого класса.

От этого тэга уж точно не получится избавиться, но можно просто произвести добавление необходимой записи в классе, расширяющем исходный(а затем его подключать). Я написал небольшое приложение на java, которое делает все необходимое; указав его вызов перед запуском компилятора, можно добиться использования необходимых ресурсов нужными классами через конфиг ant'а.
Пример конфига:
Код:

<?xml version="1.0" encoding="utf-8"?>
<project name="framework" default="build" basedir="."> 
       
        <property name="resources" value="resources"/>
       
        <taskdef resource="flexTasks.tasks" classpath="libs/flexTasks.jar" />
       
        <target name="rgen">
                <exec executable="libs/rgen.bat" dir="." failonerror="true">
                        <!-- список ресурсов  -->
                        <arg value="-resources"/>
                        <!-- {базовый класс}:{источник}:{имя} или {базовый класс}:{источник}:{символ}:{имя}-->
                        <arg value="BitmapAsset:crate.png:crate"/>
                        <!-- путь по которому расположены базовые классы ресурсов -->
                        <arg value="-package"/>
                        <arg value="mx.core"/>
                        <!-- куда складываются сгенеренные классы -->
                        <arg value="-output"/>
                        <arg value="${resources}"/>
                        <!-- откуда берем ресурсы -->
                        <arg value="-resource-folder"/>
                        <arg value="../library/"/>
                </exec>
        </target>
       
    <target name="compile">
        <mxmlc
            file="src/Application.as"
            output="bin/app.swf"
            actionscript-file-encoding="UTF-8"
                        keep-generated-actionscript="false">
                        <source-path path-element="src"/>
                        <source-path path-element="${resources}"/>
                        <includes>crate</includes>
        </mxmlc>
    </target>
       
        <target name="clean">
        <delete dir="${resources}"/>
    </target>

        <target name="build" depends="rgen,compile,clean"/>
       
</project>

флэш приложение
Код:

package  {
        import flash.display.DisplayObject;
        import flash.display.Sprite;
        import flash.utils.getDefinitionByName;
       
        public class Application extends Sprite{
               
                public function Application() {
                       
                        this.addChild((new (getDefinitionByName("crate") as Class)) as DisplayObject);
                }
               
        }
}

пример использования + исходники


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

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