3

В этой части будем создавать смену экранов. И так начнем…

Первым делом во Flash Develop’e (FD) создадим новый проект(AS3 project with Preloader) и назовем его “My super TD game”. Переходим в папку src, создаем папку com , а в ней byflasher и еще папочку screen. Вроде бы все подготовили, теперь нужно создать возможность перехода экрана. За основу я взял урок на activetuts.com, кому интересно, пускай почитает :). Конечно такой менеджер не идеален, но довольно прост и практичен. Вся его суть заключена в классе ScreenHandler.as:

package com.byflasher.screen
{
 
	import flash.display.Sprite;
	import flash.display.MovieClip;
	import flash.display.Stage;
	import flash.events.Event;
 
	public class ScreenHandler extends MovieClip
	{
 
		private var splashScreen:SplashScreen;
		private var mainMenu:MainMenu;
		private var levelSelect:LevelSelect;
		private var game:Game;
 
		private var credits:Credits;
		private var victory:Victory;
 
		private var newScreenName:String = "";
 
		private var screenLayer:Sprite = new Sprite();
		private var transitionLayer:Sprite = new Sprite();
		private var transition:Transition;
		private var transTimer:Number = 0;
		private var makeTransition:Boolean;
 
		//------names of screens------
 
		public static const SCR_SPLASH_SCREEN:String = 'SplashScreen';
		public static const SCR_MAIN_MENU:String	 = 'MainMenu';
		public static const SCR_LEVEL_SELECT:String	 = 'LevelSelect';
		public static const SCR_GAME:String			 = 'Game';
		public static const SCR_CREDITS:String		 = 'Credits';
		public static const SCR_VICTORY:String		 = 'Victory';
 
		//---------------------------
 
		//------------my-------------
 
		public var stg:Stage;
		public var level:int = 1;
 
		//---------------------------
 
		public function ScreenHandler(_stage:Stage = null)
		{
			stg = _stage;
 
			this.addChild(screenLayer);
			this.addChild(transitionLayer);
 
			/*
			 * Start screen
			 */
 
			splashScreen = new SplashScreen();
			screenLayer.addChild(splashScreen);
 
		}
 
		public function switchTo(screenName:String, trans:Boolean = true):void
		{
			newScreenName = screenName;
			makeTransition = trans;
			this.addEventListener(Event.ENTER_FRAME, switchScreens);
		}
 
		private function switchScreens(e:Event):void
		{
			if (makeTransition)
			{
				transTimer++;
				if (transTimer == 1 && transitionLayer.numChildren < 1)
				{
					transition = new Transition();
					transitionLayer.addChild(transition);
				}
				if (transTimer == transition.exitFrames)
				{
					removeOldScreen();
					makeNewScreen();
					transTimer = 0;
					this.removeEventListener(Event.ENTER_FRAME, switchScreens);
				}
			}
			else
			{
				removeOldScreen();
				makeNewScreen();
				this.removeEventListener(Event.ENTER_FRAME, switchScreens);
			}
		}
 
		private function removeOldScreen():void
		{
			screenLayer.removeChild(screenLayer.getChildAt(0) as MovieClip);
		}
 
		private function makeNewScreen():void
		{
			switch(newScreenName)
			{
				case "SplashScreen":
				{
					splashScreen = new SplashScreen();
					screenLayer.addChild(splashScreen);
				}
				break;
 
				case "MainMenu":
				{
					mainMenu = new MainMenu();
					screenLayer.addChild(mainMenu);
				}
				break;
				case "LevelSelect":
				{
					levelSelect = new LevelSelect();
					screenLayer.addChild(levelSelect);
				}
				break;
				case "Game":
				{
					game = new Game();
					screenLayer.addChild(game);
					dispatchEvent( new Event('game_start') );
				}
				break;
				case "Credits":
				{
					credits = new Credits();
					screenLayer.addChild(credits);
				}
				break;
				case "Victory":
				{
					victory = new Victory();
					screenLayer.addChild(victory);
				}
				break;
				default:
				{
					mainMenu = new MainMenu();
					screenLayer.addChild(mainMenu);
				}
				break;
			}
			newScreenName = "";
		}
	}
}

Мой код отличаться от исходного, т.к. я подстраивал под себя:). Как я говорил, графика будет импортирована через swc. В данном уроке повторять мои действия параллельно не получится, т.к. это долго и неинтересно. Так, что вам следует скачать исходник… А я могу лишь рассказать, как это работает.

В .fla файле создаются мувиклипы, которые будут разными экранами в игре. Например, мувик MainMenu_mc будет главным меню, SplashScreen_mc - заставкой и т.д. Все эти мувики экспортируются, а потом расширяются соответствующими классами, например, класс Victory расширяет Victory_mc, вот пример кода:

package com.byflasher.screen
{
 
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	public class Victory extends Victory_mc
	{
 
		// Initialization:
		public function Victory()
		{
 
			playBtn.addEventListener(MouseEvent.CLICK, playFunction);
			menuBtn.addEventListener(MouseEvent.CLICK, playFunction);
			this.addEventListener(Event.REMOVED_FROM_STAGE, removeListeners);
 
		}
 
		private function playFunction(e:MouseEvent):void
		{
			if ( e.target == playBtn)
			{
				Main.screens.switchTo("LevelSelect");
			}
 
			if ( e.target == menuBtn)
			{
				Main.screens.switchTo("MainMenu");
			}
 
		}
 
		private function removeListeners(e:Event):void
		{
 
			playBtn.removeEventListener(MouseEvent.CLICK, playFunction);
			menuBtn.removeEventListener(MouseEvent.CLICK, playFunction);
			this.removeEventListener(Event.REMOVED_FROM_STAGE, removeListeners);
 
		}
 
	}
 
}

Тем самым, мы можем обращаться к разным объектам Victory_mc, таким как кнопки, мувиклипы, текстовые поля.

Заметный минус этого менеджера – не очень простое добавление новых экранов. Вот цепочка действий:

1.     Создаем мувик во флеше и экспортируем его, например с именем SuperScreen_mc

2.     Создаем новый класс(SuperScreen.as), который расширяет наш мувиклип.

3.     Идем в класс ScreenHandler.as и

a.     Создаем переменную экрана

 private var superScreen: SuperScreen;

b.     Создаем константу

 public static const SCR_SUPER_SCREEN:String           = “SuperScreen”;

c.      Редактируем case…

А на этом пожалуй все.

Скачать исходник к нулевой части (126)

(.fla для CS4)


Отзывов (3) на «Как создать игру Товер Дефенс(защита башен) на AS3 часть 0»

  1. Василий

    Спасибо! Очень познавательно.

  2. HexD

    копипаст форевер!
    хоть сайт с которого сдираешь кидай)

  3. byflasher

    http://byflasher.com/tower-defence/kak-sozdat-igru-tover-defenszashhita-bashen-na-as3/

    если бы это был копипаст, а не перевод с редактированием кода..


Трекбеки/Пинги


Ваш отзыв