В этой части будем создавать смену экранов. И так начнем…
Первым делом во 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)
5 ноября 2010, 22:52
Спасибо! Очень познавательно.
22 декабря 2010, 9:50
копипаст форевер!
хоть сайт с которого сдираешь кидай)
22 декабря 2010, 13:28
http://byflasher.com/tower-defence/kak-sozdat-igru-tover-defenszashhita-bashen-na-as3/
если бы это был копипаст, а не перевод с редактированием кода..