«Ссылка» против SWC во Flex - PullRequest
1 голос
/ 10 марта 2010

Я пытаюсь сделать очень простое приложение во Flash / Flex, которое загружает изображение, встроенное в сам swf, а затем показывает его. Дело в том, что я пытаюсь сделать это, используя только командную строку (mxmlc и compc), без использования @Embed и с треском проваливаясь.

У меня очень простой Main.as:

package
{
    import flash.display.*;
    import flash.utils.*;

    public class Main extends Sprite
    {
        public function Main () : void 
        {
            var pDef:Class = getDefinitionByName("icon_big.png") as Class;
            var _image:BitmapData = new pDef(0, 0);

            var pSprite:Sprite = new Sprite();          
            pSprite.graphics.beginBitmapFill(_image);
            pSprite.graphics.drawRect(0, 0, _image.width, _image.height);
            pSprite.graphics.endFill();

            addChild(pSprite);
        }   
    }
}

Это прекрасно работает, если я добавляю icon_big.png в библиотеку с помощью Flash IDE, но я не могу понять, как это сделать из командной строки.

Я использую compc, чтобы поместить png в swc:

compc --include-file icon_big.png icon_big.png -output assets.swc

Это генерирует 17 КБ assets.swf, немного больше, чем icon_big.png. Затем я пытаюсь скомпилировать и связать Main.as:

mxmlc -include-libraries+=assets.swc Main.as

В результате получается файл Main.swf размером 944 байта, который явно не содержит актив и завершается с ошибкой во время выполнения.

Согласно документам mxmlc, которые я нашел, -include-library должна связываться с каждым классом, включая те, на которые нет прямой ссылки в коде (как здесь, так как я получаю класс из кода), и это неудивительно дает сбой во время выполнения.

Обратите внимание, что этот же код (или, точнее, вполне эквивалентный код) работает при использовании в проекте Flash - я не пытаюсь исправить код, а пытаюсь сделать в командной строке все, что Flash делает внутри.

Я чувствую, что просто "не понимаю" что-то ... какие-то подсказки?

Ответы [ 4 ]

0 голосов
/ 15 марта 2010

У меня была похожая ситуация (большой проект, swc ресурса с графическими активами), и, несмотря на то, что я пытался, я не мог заставить Flex включать ресурсы и классы, на которые нет прямой ссылки из проекта (я хотел включить разные скины и затем создайте соответствующий экземпляр во время выполнения, в зависимости от конфигурации).

Наконец, я нашел обходной путь, вместо того чтобы использовать статический swc, переключаясь на разделяемые библиотеки времени выполнения (RSL). По сути, Flex разбивает SWC, загружает и связывает включенный SWF во время выполнения перед запуском самого приложения. Все классы и ресурсы в SWF загружаются таким образом. Может быть не совсем то, что вы ищете, но это работает для меня.

0 голосов
/ 10 марта 2010

Вы пытались добавить путь ресурсов к параметру исходного пути при компиляции с mxmlc?

-source-path ./PATH/TO/ASSET

0 голосов
/ 11 марта 2010

Я думаю, вам нужно встроить PNG в класс, а затем скомпилировать этот класс в SWC. Я не думаю, что вы можете поместить PNG непосредственно в SWC, как вы пытаетесь, но я могу ошибаться.

0 голосов
/ 10 марта 2010

Я рекомендую вам скачать swftools с сайта swftools.org. Получив их, запустите:

    swfdump -D assets.swf

Посмотрите, в частности, на вывод, который относится к метке SWF со значением 76 (0x4C), которая называется SYMBOLCLASS.

Вот пример экспортированного класса с именем IntegerMemberBySlot:

[04c]        24 SYMBOLCLASS
                    exports 0001 as "IntegerMemberBySlot"

Какие символы вы экспортируете из вашего assets.swf?

...