Actionscript встроить массив - PullRequest
1 голос
/ 22 июня 2009

Я хочу встроить некоторые изображения во время компиляции, поэтому я получаю всего один SWF. Они должны быть внутри массива, так как мне нужно изменять их программно, и они могут содержать сотни изображений. Не могу использовать flex, поскольку я хочу сохранить всю функцию в ActionScript (или уменьшить размер файлов)

Я нашел, как это сделать в flex:

...
<mx:Array id="test">
   <mx:Image id="image0" source="@Embed(source='../../../lib/Images033,jpg')" />
   <mx:Image id="image1" source="@Embed(source='../../../lib/Images034,jpg')" /> 
   <mx:Image id="image2" source="@Embed(source='../../../lib/Images035,jpg')" />
   <mx:Image id="image3" source="@Embed(source='../../../lib/Images036,jpg')" />
</mx:Array>
...
addChild(test[1] as something);
...

Так кто-нибудь знает, как сделать выше, но только в Actionscript?

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 22 июня 2009

Ну, так или иначе, вам понадобится оператор Embed для каждой вещи , которую вы хотите встроить, так что вы не сможете обойти это. Но если вы предпочитаете обрабатывать все в сценарии, вы можете сделать что-то вроде этого (это приложение AIR, но все между тегами WindowedApplication должно работать в простом старом приложении Flex):

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" initialize="onInitialize()">

    <mx:Script>
        <![CDATA[

            import mx.controls.Image;

            private var images:Array;
            private const IMAGE_COUNT:uint = 5;

            [Embed(source='Image0.png')]
            private var Image0:Class;

            [Embed(source='Image1.png')]
            private var Image1:Class;

            [Embed(source='Image2.png')]
            private var Image2:Class;

            [Embed(source='Image3.png')]
            private var Image3:Class;

            [Embed(source='Image4.png')]
            private var Image4:Class;

            private function onInitialize():void
            {
                images = new Array(IMAGE_COUNT);

                // Populate your array with Class references to embedded imagery
                for (var i:int = 0; i < IMAGE_COUNT; i++)
                {
                    images[i] = this["Image" + i];
                }
            }

            override protected function createChildren():void
            {
                super.createChildren();

                // Add your children to the display list
                for (var i:int = 0; i < IMAGE_COUNT; i++)
                {
                    var img:Image = new Image();
                    img.source = images[i];

                    addChild(img);
                }
            }

        ]]>
    </mx:Script>

</mx:WindowedApplication>

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

Здесь происходят некоторые эзотерические вещи, так что, если вы не совсем все понимаете, не стесняйтесь комментировать, и я буду следить за вещами. Но это проверенный код, и он должен хорошо работать для вас, учитывая то, как вы уже объяснили свои требования.

3 голосов
/ 22 июня 2009

Я думаю, что для ответа на ваш вопрос необходимы некоторые уточнения.

Во-первых, вы разместили код MXML (не Flex). MXML - это просто способ написания ActionScript без знания ActionScript. Он также удаляет большую часть работы, которую вы должны выполнить, если вы пишете свой код в ActionScript. Когда Flex создает SWF, он смотрит на MXML и создает ActionScript из него, за кулисами.

Во-вторых, есть две части, которые большинство из нас называют «гибкими». Существует FlexBuilder, приложение, в котором вы пишете свои приложения Flex, и Flex. Flex - это всего лишь дополнительный набор библиотек ActionScript, которые предоставляют нам множество дополнительных функций по сравнению с базовым языком ActionScript.

Я думаю, вы называете MXML «Flex». Насколько я знаю, насколько я знаю, размер файла не увеличивается с помощью MXML, поскольку MXML преобразуется в ActionScript до создания SWF-файла.

Итак, лучшим ответом на ваш вопрос может быть просто использовать MXML.

Если это не так, то:

Вы встраиваете изображения и другие ресурсы в ActionScript, используя тег метаданных Embed в сочетании с объектом Class.

Хороший пример того, как это сделать, вы можете увидеть в этом разделе документации Adobe по расширенному программированию Flex.

http://livedocs.adobe.com/flex/3/html/help.html?content=embed_4.html

Однако было бы действительно утомительно делать это для сотен изображений. Даже больше, чем делать это в MXML. Я настоятельно рекомендую загружать их программно во время выполнения. Было бы намного меньше кода и намного меньше времени загрузки для пользователя и т. Д.

Надеюсь, это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...