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

Регистрация: Feb 2010
Сообщений: 95
По умолчанию Прелоадер работает неверно

Здраствуйте.

По этой инструкции - http://asgamer.com/2009/making-a-com...-the-preloader - создавал прелоадер, но добится результата так и не смог

Работаю с Flash CS4 и Flash Develop. Есть игра, нужен прелоадер. В главном таймлайне изначально ничего не было; последовательность моих действий такова:

1) Создал анимацю на 100 кадров и привязал к классу game.ThePreloader (чуть измененный класс с инструкции):

Код AS3:
package game
{
	import flash.display.LoaderInfo;
	import flash.display.MovieClip;
	import flash.events.*;
 
	public class ThePreloader extends MovieClip
	{
 
		public var ldrInfo:LoaderInfo;
 
		public function ThePreloader(ldrInfo:LoaderInfo = null)
		{
			this.ldrInfo = ldrInfo;
 
			addEventListener(Event.ENTER_FRAME, checkLoad);
		}
 
		private function checkLoad (e:Event) : void
		{
			if (ldrInfo.bytesLoaded == ldrInfo.bytesTotal && ldrInfo.bytesTotal != 0)
			{
				dispatchEvent(new Event("loadComplete"));
				phaseOut();
			}
 
			updateLoader((ldrInfo.bytesLoaded / ldrInfo.bytesTotal) * 100);
		}
 
		private function updateLoader(num:Number) : void
		{
			trace(Math.floor(num));
			gotoAndStop(Math.floor(num));
		}
 
		private function phaseOut() : void
		{
			removeEventListener(Event.ENTER_FRAME, checkLoad);
			phaseComplete();
		}
 
		private function phaseComplete() : void
		{
			dispatchEvent(new Event("preloaderFinished"));
		}
	}
}
2) Всем MovieClip*ам, которые экспортированы в классы, снял галочку загрузки в первом кадре.

3) Создал MovieClip и поместил туда все MovieClip'ы с предыдущего пункта. Вопрос - изображения и спрайты, не экспортированные в классы, сюда помещать не надо?

4) Таким образом исправил конструктор в главном классе игры Main и добавил пару функций, в соответсвии с написанным по ссылке:

Код AS3:
		private var preloader:ThePreloader;
 
 
		public function Main()
		{
			preloader = new ThePreloader(this.loaderInfo);
			stage.addChild(preloader);
			preloader.addEventListener("loadComplete", loadAssets);
			preloader.addEventListener("preloaderFinished", playGame);
		}
 
		private function loadAssets(e:Event):void
		{
			this.play();
		}
 
		public function playGame(e:Event) :void
		{
			stage.removeChild(preloader);
 
			//дальше код, который был в старом конструкторе
		}
5) Создал слой в главном таймлайне, первый и третий кадр - стоп. Создал второй слой, с AssetHolder'ом (тот, в котором хранятся все MovieClip'ы) во втором кадре.


Кажется, все.

Результат: сначала экран пустой, тогда при 60% появляется прелоадер с соответвующей позицией анимации; по результату его работы появляется меню игры, но без фона и кнопок, видны лишь только шарики, появляющиеся на экране рандомно (как я понял, видны только те MovieClip*ы, к которым я сам создавал класс).

Буду очень благодарен, если кто-то поробует разобратся и подсказать, в чем я ошибся.

И еще - в Publish Settings стоит экспорт классов в первом кадре, это никак не влияет на MovieClip'ы со снятой галочкой экспорта?

По ходу написания этого заметил такое - после прелоадера в меню видны только те спрайты, к которым я явно содавал класс. Те элементы, которым я поставил отметку экспорта в AS, но не создал класса самостоятельно, не видны. Может быть, проблема связана с этим?

Добавлено через 7 минут
Извините, в последнем абзаце ошибся. Обьяснить то, почему видна только часть спрайтов, все-таки не могу (для них тоже класс не создавался).

Добавлено через 32 минуты
Правильно ли, что у меня все изображения (текстуры) не экспортированны в классы? Хотя, их экспорт, кажется, не помогает.

Добавлено через 3 часа 30 минут
heeeelp!

Свожу вопрос к более простому.

Качаю с сайта туториала исходники. Все работает.
Всередине картинка, помещена в AssetHolder.

Что я делаю:
1) Создаю символ TestSprite с прямоугольником, который залит этим изображением.
2) Экспортирую в класс.
3) В "главной" функции класса программы (та, которая вызывается после прелоадера) пишу такое: stage.addChild(new TestSprite());

Теперь самое интересное. Если в AssetHolder кидаю картинку, то не вижу прелоадера, но вижу спрайт после загрузки. Если кидаю TestSprite, или его + картинку, то работает прелоадер, но не не видно спрайта после загрузки.

Почему так? Как добится золотой середины?


Последний раз редактировалось vinch; 21.02.2010 в 23:46.