Встроенный прелоадер (AS3)

Предупреждение: материал устаревший, частично трактовка технологий неверная.

Первую запись хочу посвятить этой многозначительной и мучительной теме, сколько я не искал материалов в сети всегда натыкался только на одну ссылку.

Прочитав данный материал, освоив его, я приступил к делу.
К моему большому удивлению, проделав все описанное в статье, для своего проекта, я обнаружил, что результат неудовлетворительный — полоса загрузки появлялась буквально под конец, и стоит учесть, что у меня использовалась конструкция [Embed] (благо CS4 позволяет это), вероятно я что-то сделал неверно, но факт остался фактом — реорганизация проекта получилась крайне замороченной и неудобной.

Я некоторое время бился с этой проблемой и решил поэкспериментировать. На деле же всё оказалось очень просто.

Начну с того что класс который используется у человека с ником etc (ссылку на его блог я привел выше) отлично подойдет и для нас. Прописываем его в качестве класса документа.

И далее производим следующие махинации: в Publish Settings (вкладка Flash) мы жмем Settings и прописываем экспорт классов на второй кадр. При этом на таймлайне у нас должно быть три пустых кадра.

Если у вас в проекте имеются компоненты, то для ассетов этих компонентов все свойства надо оставить такими как они есть — то есть галочка на экспорт класса во второй кадр должна быть отключена.

Теперь самое интересное — я думаю вы наделали уже своих спрайтов, мувиклипов и т.д. и присвоили им при необходимости классы? Если да то поздравляю, вам нужно чтобы в свойствах данных мувиклипов стояли галочки — экспортировать во второй кадр. А теперь магия чисел.

Создаем мувиклип с названием MainClass, где в качестве Base Class прописываем наш базовый класс (то есть класс основного действия вашей флэшки), и… Внимание! И тоже ставим галочку экспортировать во второй кадр.

Никаких дополнительных мувиклипов создавать не нужно.

А давайте посмотрим как же будет выглядеть у нас класс прелоадера?
А вот и он:

package com.preloader {
   import flash.display.MovieClip;
   import flash.display.Sprite;
   import flash.events.Event;
   import flash.events.ProgressEvent;
   import flash.utils.getDefinitionByName;
 
   /**
    * @author Ilya Malanin (designer@pastila.org)
    */
   public class Preloader extends MovieClip {
 
      private var progressBar : Sprite;
      private static const ENTRY_FRAME : int = 3;
 
      public function Preloader() : void {
          super();
          stop();
          progressBar = new Sprite();
          progressBar.y = stage.stageHeight / 2 - 2;
          with (progressBar.graphics) {
              beginFill(0x0, 1);
              drawRect(0, 0, stage.stageWidth, 4);
              endFill();
          }
 
          addChild(progressBar);
 
          loaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
          loaderInfo.addEventListener(Event.COMPLETE, completeHandler);
      }
 
      private function completeHandler(event : Event) : void {
          play();
          addEventListener(Event.ENTER_FRAME, enterFrameHandler);
      }
 
      private function enterFrameHandler(event : Event) : void {
          if (currentFrame >= ENTRY_FRAME) {
              removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
              stop();
              var main : Class = loaderInfo.applicationDomain.getDefinition("MainClass") as Class;
              addChild(new main());
          }
      }
 
      private function progressHandler(event : ProgressEvent) : void {
          progressBar.scaleX = 1 / event.bytesTotal * event.bytesLoaded;
      }
   }
}

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

p.s.
Не забудьте пожалуйста, что в главном классе вашей флэшки в конструкторе необходимо использовать такую конструкцию:

  public function SupaClass() {
      super();
      addEventListener(Event.ADDED_TO_STAGE, initSupaClass);
  }
 
  private function initSupaClass(event : Event) : void {
      ...
  }

Исходники вы можете взять тут (чтобы скомпилировать и проверить работоспособность, после распаковки архива положите в папочку images любую картинку (желательно большого размера) и назовите файл logo.jpg, теперь можно компилировать).

Posted in Flash, Actionscript 3 by Илья Маланьин at Октябрь 5, 2009.
Tags: , , , ,

25 комментариев to “Встроенный прелоадер (AS3)”

  1. Спасибо за статью. Если не трудно, выложи пожалуйста архивчик с исходниками…

  2. admin:

    Добавил.

  3. Sobcha:

    -Теперь самое интересное – я думаю вы наделали уже своих спрайтов, мувиклипов и т.д. и присвоили им при необходимости классы? Если да то поздравляю, вам нужно чтобы в свойствах данных мувиклипов стояли галочки – экспортировать во второй кадр. А теперь магия чисел.
    А как это сделать?? а то у меня только Export in First Frame есть?

  4. admin:

    Sobcha:

    А как это сделать?? а то у меня только Export in First Frame есть?

    Из статьи:

    И далее производим следующие махинации: в Publish Settings (вкладка Flash) мы жмем Settings и прописываем экспорт классов на второй кадр.

    File -> Publish Settings -> Вкладка «Flash» -> Settings… -> Export classes in frame
    И вместо единцы пишите 2

  5. алексей:

    не могу скачать исходник
    перезалейте пожалуйста .

  6. i1:

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

  7. zaidite:

    Не работает ссылка на пример прелоадера. Не совсем понятны некоторые места в описании создания. Могу я попросить сбросить пример на почту? Или перезалейте его пожалуйста. Очень нужно разобраться с этим вопросом.
    Спасибо.

  8. Илья Маланьин:

    Исправил ссылку на исходник.

  9. FlyingCianid:

    Спасибо за статью. К сожалению не получается скомпилировать и посмотреть на работу — при попытке открытия fla — unexpected file format. Не могли бы вы дополнить статью описанием того, что присутствует во fla — файле? А пока буду курить ваш код…

  10. Detected:

    Лично я считаю такой проелоудер не хорошим….предлагаю свою концепцию прелоудера(особенно необходимо с внутреним врапером среды(вконтакте, фейсбук))…исходники не дам)))
    1) Загружается прелоудер…грузит свои ассеты….инициализируется
    2)Грузит ассет игры(или что там у вас) + ассеты для игры + хмл + че там еще нобходимо для инициализации игры(или что там у вас)
    3)инициализирует игру

    Я думаю это самое верное решение!

  11. Илья Маланьин:

    Detected, концепция эта не ваша к сожалению.
    И вы немножко не по теме, в статье разбирается частный случай а именно «встроенный прелоадер», а не внешний. Статья именно этому и посвящена.

  12. Спасибо, очень понравилось

  13. lublushokolad:

    Спасибо! Спас мне жизнь. И не взорвал мозг ))
    Если увидимся на какой-нибудь конференции виски с меня!

  14. cx717:

    Я скачал зип архив, поместил в папку images картинку logo.jpg. Что делать дальше? Если нажать ctr+Enter, используя профилировщик пропускной способности, то никакого прелодера не видно.
    Что нужно сделать что бы посмотреть ваш прелодер в действии?

  15. cx717:

    Фотография — 2М. При публикации и проверке локально прелодера не видно.

  16. cx717:

    а, мигнул, видел

  17. Илья Маланьин:
    «Теперь самое интересное – я думаю вы наделали уже своих спрайтов, мувиклипов и т.д. и присвоили им при необходимости классы? Если да то поздравляю, вам нужно чтобы в свойствах данных мувиклипов стояли галочки – экспортировать во второй кадр.»

    Это же регулируется сразу для всех мувиклипов?

    cx717 Откампилишь и в том же окне выбери view->downloadspeed-> я ставлю как у DSL модема, можешь др поставить, а потом view->simulate daownload.

  18. Alxs:

    Thnx! Хороший урок… Давно искал что то подобное… Спасибо.

  19. PolarWolf:

    Скачал архив, добавил фото.
    В итоге после запуска, это фото кружит в окне. Чувствую, что-то здесь не так)

  20. PolarWolf:

    Все понял,ступил маленько)))

  21. pittpv:

    А как привязать этот прелоадер к flash сайту?

  22. Илья Маланьин:

    Для флэш-сайтов лучше всего использовать внешний прелоадер.
    Техник огромное количество в зависимости от целей. Google в помощь.

  23. pittpv:

    Илья, дело в том, что у меня все объекты создаются и выравниваются на сцене программно, а именно с помощью класса. К сожалению, в AS3 пока понимаю мало, вот и не могу определиться как лучше и какой лучше прелоадер… Могли бы вы чуть подробнее направить меня на верный путь. Спасибо.

  24. [...] внутреннего прелоадера я вычитал здесь. Если по-простому – все ресурсы прелоадера [...]

  25. Игорёк:

    Спасибо за такую прекрасную статью. Помогла очень очень. Нашел игру на флеше в инете AsteroidStorm. Там был прелоадер но понять как работает и сделать самому чтобы работало было сложно, а тут прям сразу вставил для проверки и все заработало :)

Leave a Reply