Пример ActionScript 3 загрузчика

Как известно ActionScript 3 отличается от предыдущих версий и все кто попытается скомпилировать приложение, которое содержит компонент, написанный на AS2, может столкнуться с ошибками. Меня постигла та же участь. Проверенный компонент с загрузчиком перестал работать.

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

Приложение я делал во Flash, поэтому загрузчику необходимо просто нарисовать TextField с процентом загрузки ролика, а по окончании перейти на второй кадр. Для случая Flex логичнее было бы сделать собственное событие загрузчика и сделать dispatchEvent при завершении загрузки. Но у меня не тот случай. Все просто.

Начнем с конца. В первом кадре Flash мувика нарисуем следующий текст:

import microgames.MGLoader;
var _loader:MGLoader = new MGLoader(stage,this,0xff9933);
stop();

Первая строчка означает что мой класс загрузчика будет называться MGLoader и находиться рядом с файлом программы в папке microgames. Во второй строчке создается объект MGLoader и в него передается stage, root и цвет загрузчика. И стоп.

В данном случае stage является контейнером флеш плеера, а root - его потомок. В нем находиться главная временная шкала.

Самое сложное позади. Посмотрим как все работает внутри класса:

package microgames{
	import flash.display.Stage;
	import flash.events.Event;
	import flash.display.MovieClip;
	import flash.text.TextField
	
	public class MGLoader extends MovieClip {
		
		private var _stage:Stage;
		private var _root:MovieClip;
		private var _color:uint;
		
		public function MGLoader(stage:Stage,root:MovieClip,color:uint) {
			trace("Loader start ...");
			this._stage 	= stage;
			this._root 	= root;
			this._color 	= color;
			this._stage.addEventListener(Event.ENTER_FRAME, _handleLoader);
		}
		
		private function _handleLoader(event:Event):void {
			var loaded:Number=this._stage.loaderInfo.bytesLoaded;
			var total:Number=this._stage.loaderInfo.bytesTotal;
			var percent:Number=Math.floor(loaded/total*100);
			trace(percent+"%");
			_updateProgress(percent);
			if (loaded>=total) {
				this._stage.removeEventListener(Event.ENTER_FRAME, _handleLoader);
				this._root.gotoAndPlay(2);
			}			
		}
		private function _updateProgress(percent:Number):void{

		}
	}
}

Stage нам нужен для того чтобы прикрутить к нему слушатель Event.ENTER_FRAME, получить количество загруженных байт и общий размер ролика. Root для перехода на следующий кадр после загрузки ролика.

Функция _updateProgress(percent:Number) может быть произвольной. Внутри нее можно творить все что угодно. В моем случае это будет кружочек с циферками.

Выглядит он вот так:

Файлы, используемые в статье.

Упакованный fla файл и класс загрузчика .zip

Александр Смелков
Санкт-Петербург Зима 2011