Встраивание символов из SWF-файла, созданного с помощью mxmlc - PullRequest
1 голос
/ 07 марта 2012

В моем проекте я использую swfs в комплекте с ресурсами. Эти пакеты создаются из другого служебного приложения. Приложение создает файл Package.as с тегами [Embed], помещает все ресурсы в один и тот же каталог и запускает mxmlc для компиляции пакета swf.

Комплект SWF работает как шарм. Я могу создавать экземпляры активов.

Однако я хочу реализовать другую утилиту для редактирования этих пакетов (для добавления и удаления ресурсов) Здесь проблема. Поскольку этот bundle.swf не создан из Flash, я не могу использовать:

[Embed ( source="oldbundle.swf", symbol="Package_res1" ) ]  // ( "Package_res1" is class name of resource in bundle")

при создании нового SWF. mxmlc возвращает символ не найденные ошибки.

Для активов bytearray я нашел решение. Я записываю байтовые массивы на диск, а затем использую эти файлы для встраивания. Однако я не могу сделать то же самое для векторной графики, которая была добавлена ​​как символ из Flash SWF в исходный комплект. Если я напишу битмапдаты на диск, я потеряю векторность (не уверен, что это слово :)). SVG - это не полная возможность заменить символ вспышки.

Используя as3swf , я проверил пакет SWF и увидел тег SymbolClass. Все активы определены там. Я не знаю, почему тег вставки не может найти символ. Разница с символом bundled.swf и символом SWF Flash заключается в том, что один расширяет SpriteAsset (объект фреймворка flex), другой расширяет спрайт

Что я могу сделать, чтобы использовать более старый SWF-файл в качестве исходного кода для нового SWF-файла?

Ответы [ 2 ]

0 голосов
/ 08 марта 2012

Вы также можете заставить его работать с переменными-членами, извлекая имя класса, автоматически сгенерированного mxmlc.Например, вот тот же класс Bundle снова:

// Bundle.as
package
{

import flash.display.*;

public class Bundle extends Sprite
{
    [Embed(source='image.jpg')]
    private var imageClass:Class;

    public function Bundle()
    {
        var image:DisplayObject = new imageClass();
        addChild(image);
    }
}

}

Теперь, если вы скомпилируете его с -keep:

mxmlc Bundle.as -keep

Вы можете найти сгенерированный код в файле с именемBundle_imageClass.as в каталоге generated со следующим содержимым:

package 
{

import mx.core.BitmapAsset;

[ExcludeClass]
[Embed(_resolvedSource="/Users/manish/Code/test/image.jpg", _column="6", source="image.jpg", exportSymbol="Bundle_imageClass", _line="9", _file="/Users/manish/Code/test/Bundle.as")]

public class Bundle_imageClass extends mx.core.BitmapAsset 
{
    public function Bundle_imageClass() 
    { 
        super(); 
    }

}

}

Найдите exportSymbol.Это имя вашего символа для встраивания в другие SWF-файлы.

Теперь класс Application:

// Application.as
package
{

import flash.display.*;

public class Application extends Sprite
{
    [Embed(source='Bundle.swf', symbol='Bundle_imageClass')]
    private var imageClass:Class;

    public function Application()
    {
        var image:DisplayObject = new imageClass();
        addChild(image);
    }
}

}

Используйте точное значение, которое вы найдете в exportSymbol в сгенерированном коде (в данном случае, Bundle_imageClass), и тебе должно быть хорошо.

0 голосов
/ 08 марта 2012

Ваши символы должны быть публичными.

Вот пример.Во-первых, оригинальный SWF, назовем его Bundle.swf.

// Bundle.as
package
{

import flash.display.*;

public class Bundle extends Sprite
{
    public function Bundle()
    {
        var image:DisplayObject = new Image();
        addChild(image);
    }
}

}

Здесь определено Image:

// Image.as
package
{

import flash.display.*;

[Embed(source='image.jpg')]
public class Image extends Bitmap
{
}

}   

Теперь, если вы скомпилируете Bundle.as и откроете Bundle.swf, вы увидите свое изображение.

Далее мы хотим повторно использовать его в новом SWF, назовем его Application.swf.

// Application.as
package
{

import flash.display.*;

public class Application extends Sprite
{
    [Embed(source='Bundle.swf', symbol='Image')]
    private var imageClass:Class;

    public function Application()
    {
        var image:DisplayObject = new imageClass();
        addChild(image);
    }
}

}

Скомпилируйте Application.as и откройтеApplication.swf.Вы снова увидите изображение.

Это работает, потому что Image общедоступно.

...