Те из вас, кто собирает свои as3 приложения с помощью mxmlc знакомы с метатэгом [Embed], который используется для внедрения внешних ресурсов в конечный swf. Среди поддерживаемых mxmlc типов внедряемых ресурсов присутствуют файлы изображения (JPG, JPEG, PNG и SVG), swf файлы, символы из swf файлов, mp3 файлы, файлы системных и TrueType шрифтов. Но не все знают, что с помощью [Embed] можно внедрить любой файл в виде байтовой последовательности.
Как вы знаете включение ресурсов возможно как на уровне свойства так и на уровне класса. Это справедливо и для файлов, которые мы включаем в виде байтовой последовательности. В примере ниже мы включаем в наш клип текстовый файл на уровне свойства (обратите внимание на дополнительный параметр mimeType, именно он сообщает mxmlc, что мы хотим включить файл как байтовую последовательность):
-
[Embed(source="readme.txt", mimeType="application/octet-stream")]
-
public var Readme:Class;
Если вы хотите включить свой файл на уровне класса то вы должны будете наследоваться от mx.core.ByteArrayAsset:
-
package
-
{
-
import mx.core.ByteArrayAsset;
-
-
[Embed(source="readme.txt", mimeType="application/octet-stream")]
-
public class Readme extends ByteArrayAsset {}
-
}
После этого, чтобы создать экземепляр класса нашего включенного файла просто вызываем конструктор:
-
var readme:ByteArrayAsset = new Readme(); // для уровня свойства
-
var readme:Readme = new Readme(); // для уровня класса
Так как в любом случае наш ресурс является наследником или экземпляром ByteArrayAsset, который в свою очередь расширяет ByteArray, то мы можем использовать все методы последнего. Например, прочитать содержимое текстового файла из нашего примера можно так:
-
var readmeContent:String = readme.readUTFBytes(readme.length);
В бинарном виде вы можете включать и файлы поддерживаемых типов. Например, вы можете включить другой swf в виде последовательности байтов, после чего можно внести swf в список видимых объектов или получить доступ к его внутренним ресурсам, предварительно использовав Loader:
-
package
-
{
-
import flash.display.Loader;
-
import flash.display.Sprite;
-
import flash.events.Event;
-
-
public class EmbedResourceExample extends Sprite
-
{
-
[Embed(source="assets/resources.swf", mimeType="application/octet-stream")]
-
private var Resources:Class;
-
-
public function EmbedResourceExample ()
-
{
-
var loader:Loader = new Loader();
-
// Подписываемся на событие INIT, после которого
-
// мы получим доступ к классам внутри включенного swf
-
loader.contentLoaderInfo.addEventListener(Event.INIT, resourceInitHandler);
-
// Загружаем swf как байтовую последовательность
-
loader.loadBytes(new Resources());
-
}
-
-
private function resourceInitHandler (e:Event):void
-
{
-
// Извлекаем и создаем экземпляр класса из включенного swf
-
var SomeClass:Class = e.target.content.loaderInfo.applicationDomain.getDefinition("SomeClass") as Class;
-
var someClass:Object = new SomeClass();
-
}
-
}
-
}
Пожалуй на этом все.
Напоследок хочу отметить, что метатэг [Embed] не распознается flash compiler и включить тот же текстовый файл в swf силами Flash IDE не получится.
Удачи!








