Показать сообщение отдельно
Старый 14.06.2016, 03:54
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 1  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
По умолчанию не работает preloader - белый экран

Здравствуйте!
В сети нашёл огромное количество обсуждений данный проблемы, но ни одно из решений не помогло. Вы моя последняя надежда, выручайте, пожалуйста!
Код пишу во FlashDevelop, графику импортирую его средствами через swc (галочка "Add to library").
Использую чуть модифицированную версию стандартного прелоадера FlashDevelop, который создаётся при выборе "AS3 Project with Preloader" при создании нового проекта.
Вот код прелоадера:
Код AS3:
package
{
	import flash.display.DisplayObject;
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.ProgressEvent;
	import flash.utils.getDefinitionByName;
	import rc.TF;
 
	public class Loader extends MovieClip 
	{
 
		private var _txt:TF; // TF - это собственный класс для текста
 
		public function Loader() 
		{
			if (stage) {
				stage.color = 0x000000; // цвет сцены
				stage.scaleMode = 'showAll';
				stage.align = 'C';
			}
			addEventListener(Event.ENTER_FRAME, checkFrame);
			loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
 
			// Создаём индикатор
			_txt = new TF(360, 210, '', 14, 'center', 0xFFFFFF);
			addChild(_txt);
		}
 
		// Обновление индикатора
		private function progress(e:ProgressEvent):void {
			// вычисляем процент загрузки
			_txt.update('loading...\n' + int(e.bytesLoaded * .001) + '/8516kb');
		}
 
		// проверяем кадр (не проверяем bytesTotal, т.к. некоторые браузеры возвращают 0)
		private function checkFrame(e:Event):void 
		{
			if (currentFrame == totalFrames) {
				// загрузка закончилась, начинаем 
				loadingComplete();
			}
		}
 
		private function loadingComplete():void 
		{
			removeEventListener(Event.ENTER_FRAME, checkFrame);
			loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
			// убираем индикатор
			removeChild(_txt);
			_txt = null;
			startup();
		}
 
		private function startup():void 
		{
			// получаем ссылку на главный класс нашего приложения
            var mainClass:Class = getDefinitionByName("Game") as Class;
            // создаем объект главного класса
			addChild(new mainClass() as DisplayObject);
            // удаляем из stage прелодер
            //parent.removeChild(this);
		}
 
	}
 
}
Вот код основного класса:
Код AS3:
package {
 
	import flash.display.Sprite;
	import flash.events.Event;
 
	// вот эта строка сообщает компилятору,
    // что надо показать прелодер до тех пор пока все не загрузится
	[Frame(factoryClass = "Loader")]
	public class Game extends Sprite {	
 
		// ТУТ РАЗНЫЕ СВОЙСТВА КЛАССА
 
		// CONSTRUCTOR
		public function Game():void {
			if (stage) { init() } else { addEventListener(Event.ADDED_TO_STAGE, init) };
		}
 
		// INIT
		private function init(e:Event = null):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			// точка входа в игру
		};
 
		// ДАЛЬШЕ РАЗНЫЕ ФУНКЦИИ
};
При запуске из FlashDevelop прелоадер проходит мгновенно. Но при загрузке с сервера появляется белый экран, а через несколько секунд игра включается сразу, минуя прелоадер (на самом деле, он, видимо, всё же, включается, но, опять же, на мгновение).
Насколько я понимаю, проблема в том, что всё грузится до прелоадера, но почему это происходит, не пойму.

Пожалуйста, помогите! Почему не работает прелоадер и как это исправить?

Добавлено через 29 минут
Всё, нашёл, кажется... Дело было в обращении к классу TF - внутри него была ссылка на шрифт, который входит в библиотеку. Видимо из-за обращения к элементу библиотеки она начинала грузиться полностью. Вставил индикацию через простое TextField и всё заработало.