Как создать Preloader в AS3 - PullRequest
       6

Как создать Preloader в AS3

6 голосов
/ 07 декабря 2011

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

Заранее спасибо!

Ответы [ 5 ]

12 голосов
/ 07 декабря 2011

Обновление:

Опция 1. Flash IDE, один файл SWF

Чтобы иметь встроенный предварительный загрузчик при компиляции с Flash IDE, необходимоследует переместить ваш код Document Class во 2-й кадр вашего FLA-файла (конечно, без конструктора пакета и класса) и удалить файл Document Class .as из свойств проекта.В первом кадре вы должны поместить такой код:

stop(); // stops the timeline at preloader frame
this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
function onProgress(e:ProgressEvent):void {
    var percent:Number = Math.round(e.bytesLoaded / e.bytesTotal * 100);
    //additional code to update preloader graphics
    //..
    if (percent == 100) onLoaded();
}
function onLoaded() {
   this.loaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
   nextFrame();
}

После загрузки swf он переходит к следующему кадру, и должен выполняться исходный код инициализации приложения.Это хорошо работает, если вы организовали свой проект таким образом, что большинство ресурсов (изображений и т. Д.) Находятся в библиотеке Flash IDE и не загружены в первый кадр (вы можете проверить это в свойствах каждого элемента библиотеки).

Вариант 2. Flash IDE, два файла swf

Другой вариант, как уже рекомендовано другим комментатором, - сохранить swf приложения в том виде, как он есть, и создать еще один легкий swfчто бы загрузить первый.Код файла preloader.swf в первом кадре:

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
loader.load(new URLRequest("path/to/application.swf"));

function onProgress(e:ProgressEvent):void
{
   var percent:Number = Math.round(e.bytesLoaded / e.bytesTotal * 100);
   //additional code to update preloader graphics
   //..
   if (percent == 100) onLoaded();
}
function onLoaded():void
{
   loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
   var application:DisplayObject = loader.content;
   addChild(application);
}

Иногда при таком подходе возникают дополнительные проблемы, когда вы пытаетесь получить доступ к stage с вашего Document Class constructor и т. Д., Но в большинстве случаев это следует делатьзадание.

Вариант 3. Различная среда разработки, моя рекомендация: FlashDevelop

Если вы пытались скомпилировать мой первоначально опубликованный код с помощью FlashDevelop, FlashBuilder или любой другой IDE, он должен работать.

Исходное сообщение:

Вот основные настройки для встроенного preloader.Ваш Document Class должен выглядеть следующим образом:

package {

  import flash.display.Sprite;

  [Frame(factoryClass='Preloader')] //class name of your preloader

  public class Main extends Sprite {

     public function Main() {
        //init
     }
  }
}

Класс Preloader:

package {

   import flash.display.DisplayObject;
   import flash.display.MovieClip;
   import flash.events.ProgressEvent;
   import flash.utils.getDefinitionByName;

  public class Preloader extends MovieClip {

     public function Preloader()
     {
        //add preloader graphics 

        //check loading progress
        this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
     }
     private function onProgress(e:ProgressEvent):void 
     {
        var percent:Number = Math.round(e.bytesLoaded / e.bytesTotal * 100);
        if (percent == 100)
        {
          this.loaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
          onLoaded();
        }
     }
     private function onLoaded():void
     {
       nextFrame(); //go to next frame
       var App:Class = getDefinitionByName("Main") as Class; //class of your app
       addChild(new App() as DisplayObject);
     }
  }
}
1 голос
/ 07 декабря 2011

Я рекомендую пойти по маршруту «легкий swf загружает тяжелый swf», так как он самый эффективный из всех, что я видел.Существует множество раздутых уроков, но мне нравится этот http://doogog.com/actionscript-3-external-preloader.html Это прямо к делу.

0 голосов
/ 17 июня 2014

[Frame (factoryClass = 'Preloader')] больше не работает в новом компиляторе ASC 2.0. Вместо этого предварительный загрузчик становится вашим классом документов, и вам нужно добавить дополнительный аргумент компилятора, чтобы Flash указывал включить ваш основной класс во второй кадр (не указывайте его в предварительном загрузчике):

-реперов = NameDoesntMatter, Main

Распознает ли ASC 2.0 теги метаданных [Frame] (например, для Preloader factoryClass)?

ASC2.0 и метатег Frame

0 голосов
/ 07 декабря 2011

Вы также можете использовать стороннюю библиотеку, такую ​​как Greensock, для предварительной загрузки как до запуска приложения, так и во время загрузки файлов приложения.

Я лично использую Greensock и рекомендую его.Устраняет некоторые ошибки с помощью класса loaderInfo.

http://www.greensock.com/loadermax/

0 голосов
/ 07 декабря 2011

Вот статья как создать встроенный pre3 загрузчик as3 http://www.kirupa.com/forum/showthread.php?351689-actionscript-preloader-in-flash-develop

...