Как да вградите swf и да заредите по време на изпълнение?

Опитвам се да заредя вграден swf (който действа като звукова библиотека). Тъй като е голям swf, искам да го заредя по време на изпълнение и лентата за зареждане да показва колко е заредено.

Правейки проучване онлайн, открих, че използването на mimeType="application/octet-stream" би било начинът да направя това. Резултатът обаче е, че вграденият swf все още се зарежда по същото време, когато се зарежда главният/обвиващ swf. Така че по някаква причина целият вграден swf вече е зареден, когато стигна до първия ред код (в този случай конструкторът LoadTest). Повечето примери, които намерих, се занимават с Flex и аз използвам 100% as3 проект (във FlashDevelop), но не виждам причина това да работи по различен начин.

Ето класа, който използвам (истинският клас е много по-сложен, но това би била основната механика на зареждане на вградения swf)

package {
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.system.LoaderContext;

public class LoadTest extends Sprite {

    [Embed(source = "soundLib.swf", mimeType="application/octet-stream")]
    private var _soundLibSWFClass:Class;
    private var _assetLdr:Loader;

    public function LoadTest():void {
        this._assetLdr = new Loader();
        this._assetLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, this.handleComplete);
        this._assetLdr.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, this.handleProgress);
        this._assetLdr.loadBytes(new _soundLibSWFClass(), new LoaderContext(false, this._assetLdr.contentLoaderInfo.applicationDomain));

        trace("start");
    }
    public function handleComplete(event:Event):void {
        trace("complete");
    }
    public function handleProgress(event:ProgressEvent):void {
        trace("progress " + event.bytesLoaded +", "+ event.bytesTotal);
    }

}
}

Ето какво получавам в резултата си:

progress 0, 2411787
progress 2411787, 2411787
start
complete

Ето малко повече информация за вградения swf и нещата, които опитах досега:

  • Звуковата библиотека е създадена във Flash cs5 и всички звуци се намират в библиотеката и имат правилни идентификатори.
  • Сцената на вградения swf е празна.
  • С опцията "Експортиране на класове в рамка" уморих и 1, и 2, но това нямаше значение.
  • Имам същия проблем със зареждането на други swf библиотеки (съдържащи филмови клипове например), но звуковата библиотека изглеждаше най-простата за използване в теста
  • Тествах това на различни сървъри
  • Изчистих кеша преди всеки тест.
  • Използвах симулация на честотна лента, за да съм 100% сигурен, че зареждането на цялото нещо ще отнеме известно време.
  • Дори ако премахна всички неща за зареждане, зареждането на основния swf ще отнеме известно време, което означава, че вграденият swf се зарежда едновременно.

Надявам се, че някой може да ми помогне с този проблем или има друг подход за зареждане на вграден swf по време на изпълнение (по принцип имам нужда от един swf, без цялото нещо да се зарежда наведнъж).

Благодаря!


person Arno van Oordt    schedule 21.12.2012    source източник
comment
Благодаря ви, сър, че ми показахте как да настроя LoaderContext на вграден SWF :D   -  person Jono    schedule 06.02.2013


Отговори (1)


Етикетът Embed се използва за записване на данните в swf по време на компилиране. Това, което искате да използвате, е функцията .load на Loader-обекта и да премахнете изцяло етикета Embed.

this._assetLdr.load(new URLRequest("soundLib.swf"));

Разбира се, трябва също така да се уверите, че soundLib.swf се намира в същата папка като вашия компилиран swf.

person mackanward    schedule 21.12.2012
comment
Проблемът е, че този метод ще изисква два swf файла, докато аз бих искал да имам всичко в един единствен swf. - person Arno van Oordt; 21.12.2012
comment
Swf файлът като библиотека не се различава от файл с изображение или друг актив, зареден по време на изпълнение. Няма значение, че имате два .swf файла. Само един от тях контролира. - person Gone3d; 21.12.2012
comment
Проблемът е, че в този конкретен случай имам нужда само от един swf. Тъй като е възможно да има стрийминг swf hwen, който се развива във Flash SDK (поставете зареждащ файл на първия кадър и останалото съдържание във втория кадър), това трябва да е възможно и при създаване на чист as3 проект, нали? - person Arno van Oordt; 28.12.2012