Создавая собственный предварительный загрузчик AS3, я заметил, что когда мой SWF выполняется локально (file: ///), предварительный загрузчик застревает на экране загрузки при предварительном просмотре в веб-браузере, таком как Chrome.

Когда он выполняется с удаленного сервера или через автономный Flash Player, он работает. Я заметил, что другие SWF-файлы, у которых есть предварительные загрузчики, не имеют этой проблемы. Что мне нужно изменить?

this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, preloaderProgress);

function preloaderProgress(event:ProgressEvent):void {

    var loadedPercent:Number = event.bytesLoaded/event.bytesTotal*100;

    if (loadedPercent == 100){
        this.gotoAndStop(2);
    }
}
0
user780756 11 Апр 2014 в 06:16

2 ответа

Лучший ответ

Следуя примеру на http://stephenscholtz.com/201110/single-movie-flash -preloading-as3

Кажется, что не было ProgressEvent.COMPLETE, но вместо него есть Event.COMPLETE, что немного сбивает с толку.

Я изменил свой код на следующий (включая некоторые настройки для меню правой кнопки мыши, чтобы запретить пользователю щелкать правой кнопкой мыши и нажимать Play до загрузки фильма и т. Д.)

//Initialize any variables
var loadedPercent:Number = 0;

//Remove all items from right click Flash Player menu (except Quality, and the mandatory About... & Settings...)
var cxMenu:ContextMenu = new ContextMenu();
cxMenu.hideBuiltInItems();
cxMenu.builtInItems.quality = true;
this.contextMenu = cxMenu;

/* or disable right click menu completely (Flash Player 11.2.202.228 and over) */
/* this.addEventListener(MouseEvent.RIGHT_CLICK, onMouseRightClick);
function onMouseRightClick(event:MouseEvent) 
{
    return false;
} */

//Disable shortcut keys and window menubar when played from desktop Standalone Flash Player app
if (Capabilities.playerType == "StandAlone" || Capabilities.playerType == "External") {
    fscommand("showmenu", "false");
    fscommand("trapallkeys", "true");
}

/* Preloader: begin */

//Update loading bar and percent text as SWF loads
function onProgress(e:Event) {

    //Get the amount of bytes that have been loaded / bytes total to load
    loadedPercent = this.loaderInfo.bytesLoaded/this.loaderInfo.bytesTotal*100;

    //Update the text of _preloaderProgress movieclip
    _preloaderProgress.text = int(loadedPercent)+"%";

    //Update the _preloaderBar amount by scaling horizontally as it loads
    _preloaderBar.scaleX = loadedPercent/100;

}

//Go to next frame after everything loads
function init(e:Event) {
    gotoAndStop(2);
}

//Attach the events to the stage
this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
this.loaderInfo.addEventListener(Event.COMPLETE, init);

/* Preloader: end */

//Stop to 1st frame and wait until it is loaded
stop();

Это позволит без проблем воспроизводить фильм как удаленно, так и локально.

0
user780756 11 Апр 2014 в 18:22

Загрузка локально идет очень быстро. Вы должны не только проверить, полностью ли загружен файл, используя Event.COMPLETE, а не ProgessEvent, но вы также должны убедиться, что зарегистрировали своих слушателей перед фактическим вызовом load, иначе файл может быть полностью загружен до того, как вы зарегистрируете своих слушателей.

1
BotMaster 11 Апр 2014 в 22:18