2009-12-23 9 views
1

У меня есть проблема ...Загрузка одного и того же SWF снова и снова. Есть лучший способ сделать это?

У нас есть приложение, которое должно загружать различное количество графики строк в зависимости от ввода пользователем. В настоящее время каждая строка SWF загружается повторно с использованием Flash.Display.Loader. SWF довольно большой (17k), и загрузка 10 или около того из них занимает некоторое время. Есть ли способ загрузить этот файл только один раз и использовать его несколько раз?

Я чрезвычайно новичок в Flash/ActionScript. Если есть какая-то другая информация, просто дайте мне знать, и я постараюсь ее предоставить.

спасибо.

ответ

2

Эй, да, вы можете загрузить его один раз; вы можете иметь все свои активы в одном SWF, а после загрузки использовать их по мере необходимости.

Например, предположим, вы хотите использовать две графические строки (фрагменты роликов), rowA и rowB, на SWF, которые вы должны загрузить; этот SWF будет действовать как ваша библиотека ресурсов. Что вам нужно сделать, так это создать клипы ролика rowA и rowB в вашей библиотеке и настроить их для экспорта в ActionScript. (В библиотеке FLA щелкните правой кнопкой мыши по ним и выберите свойства и выберите «Экспорт для ActionScript» в поле ввода класса введите «rowA» для этого примера и «rowB» соответственно). Теперь, когда у вас есть активы в вашей библиотеке (они не должны на сцене), опубликуйте swf-файл.

Теперь перейдем к SWF, где вы фактически будете использовать эту «библиотеку». Здесь вам просто нужно загрузить свою библиотеку SWF (та, которая имеет графические объекты), и вам хорошо идти. Пример кода,

// Our URL Request 
    var req:URLRequest = new URLRequest(); 
    req.url = "assets.swf"; 

    // Let create our loader 
    var loader:Loader = new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLibLoaded); 

    var context:LoaderContext = new LoaderContext(); 
    context.applicationDomain=ApplicationDomain.currentDomain; 

    loader.load(req,context); 


    function onLibLoaded(e:Event):void 
    { 
    createRows(); 
    } 

    function createRows() 
    { 
    var myRowAClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("rowA") as Class; 
    var rowA:MovieClip = new myRowAClass() as MovieClip; 
    this.addChild(rowA); 

    var myRowBClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("rowB") as Class; 
    var rowB:MovieClip = new myRowBClass() as MovieClip; 
    rowB.y = rowA.height; 
    this.addChild(rowB); 
    } 

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

2

Вы можете использовать два подхода в дополнение к тому, что falomir говорит:

1.- Если ваш SWF-это просто изображение (и вы можете использовать его в качестве растрового изображения), вы можете создать BitmapData из загруженного SWF, а затем использовать его столько раз, сколько вам нужно:

var bmp:BitmapData = new BitmapData(loader.width, loader.height, true, 0); 
bmp.draw(loader); 
var row1:Bitmap=new Bitmap(bmp); 
var row2:Bitmap=new Bitmap(bmp); 

2.- Если ваш SWF анимированный и/или интерактивное (а не только растровые), вы можете загрузить его в виде двоичного URLLoader, а затем используйте Loader.loadBytes для его тиражирования в вашей заявке:

var urlloader:URLLoader = new URLLoader(); 
urlloader.dataFormat = URLLoaderDataFormat.BINARY; 
urlloader.addEventListener(Event.COMPLETE, swfloaded); 
urlloader.load("miswf.swf"); 
function swfloaded(e:Event):void { 
    var bytes = urlloader.data; 
    var row1:Loader = new Loader(); 
    row1.loadBytes(bytes); 
    var row2:Loader = new Loader(); 
    row2.loadBytes(bytes); 
} 

Обратите внимание, что loadBytes является асинхронным, поэтому вам нужно дождаться, когда его событие loaderInfo COMPLETE сможет обрабатывать его содержимое ... похожее на то, что вы уже делаете (используя Loader), но для этого потребуется только один запрос сервера.

Смежные вопросы