Начав переводить комментарии к коду и вообще разбираться в самом коде стало понятно, что просто и быстро мне не отделаться… Я всего-лишь хотел заменить нарисованную кодом графику, на мувиклипы, добавить больше возможностей при создании разных уровней и перевести комментарии. Думал все будет легко и просто… А теперь фактически полностью потребуется переписывать код классов. Короче, начнем.
Пока нам потребуется 3 класса:
Первый TDGame.as – главный класс игры, в нем происходит создание левела, расстановка ячеек и т.п. Код расстановки ячеек был “позаимствован” из урока ant-karlov’а
package com.byflasher.game { import com.byflasher.game.levels.*; import com.byflasher.game.parts.DirectBlock; import com.byflasher.game.parts.EmptyBlock; import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; /** * @author Maxim Sidorkin aka hitab * @site http://byflasher.com/ */ public class TDGame extends Sprite { // Массив, в котором хранятся классы игр private var levelsArray:Array = [null, Level1, Level2, Level3]; // Многомерный массив, который будет содержать карту левела private var lvlArray:Array = []; // Мувик, в котором будет расположена наша игра private var gameContainer:MovieClip; public function TDGame(gameContainer:MovieClip) { this.gameContainer = gameContainer; this.addEventListener(Event.ADDED, init); } private function init(e:Event):void { this.removeEventListener(Event.ADDED, init); // Класс текущего левела var curLevelClass:* = levelsArray[Main.currLevel]; // Функция, которая создаст массив и задаст фоновую картинку curLevelClass.init(); // Присваиваем массив, который содержит карту левела lvlArray = curLevelClass.levelMap; // Добавляем на задний фон картинку gameContainer.addChildAt(curLevelClass.levelBG, 0); // Функция, которая добавит дорогу и пустые ячейки makeMap(); } private function makeMap():void { var mapHolder:Sprite = new Sprite(); // Спрайт, который будет содержать все части карты addChild(mapHolder); // Добавляем в список отображения var block:MovieClip; // Мувик, который будет добавлен в список отображения var posX:int = 0; // Положение текущей ячейки по ширине var posY:int = 0; // Положение текущей ячейки по высоте // Двигаемся по высоте карты for (var ay:int = 0; ay < Main.MAP_HEIGHT_MAX; ay++) { // Двигаемся по ширине карты for (var ax:int = 0; ax < Main.MAP_WIDTH_MAX; ax++) { // Создаем карту из ячеейк if (lvlArray[ay][ax] is String) { // Напрвленная ячейка, часть дороги, по которой будут ходить враги block = new DirectBlock(lvlArray[ay][ax], posX, posY); } else if (lvlArray[ay][ax] == 1) { // Простая, квадратная ячейка, часть дороги, по которой будут ходить враги block = new DirectBlock('DEFOULT', posX, posY); } else if (lvlArray[ay][ax] == 0) { // Пустая ячейка, на место которой в дальшейшем можно будет ставить оружие block = new EmptyBlock(posX, posY); } // Добавляем ячейку в контейнер mapHolder.addChild(block); // Меняем положение текущей ячейки по ширине posX += Main.MAP_CELL_SIZE; } // Меняем положение текущей ячейки по высоте posY += Main.MAP_CELL_SIZE; posX = 0; } } } }
Второй класс EmptyBlock.as – это пустая ячейка, на которую в дальнейшем можно будет ставить оружие.
package com.byflasher.game.parts { import flash.display.MovieClip; import flash.events.Event; import flash.events.MouseEvent; public class EmptyBlock extends EmptyCell { public function EmptyBlock(x:int, y:int) { this.x = x; this.y = y; this.addEventListener(Event.ADDED, beginClass); } private function beginClass(e:Event):void { this.removeEventListener(Event.ADDED, beginClass); this.addEventListener(Event.REMOVED_FROM_STAGE, destroy); this.buttonMode = true; // Делаем ячейку кликабельной this.addEventListener(MouseEvent.MOUSE_OVER, thisMouseOver); this.addEventListener(MouseEvent.MOUSE_OUT, thisMouseOut); this.addEventListener(MouseEvent.CLICK, thisClick); } private function thisMouseOver(e:MouseEvent):void { // Переходим на второй кадр, тем самым показываем, что на ячейку можно нажимать gotoAndStop(2); } private function thisMouseOut(e:MouseEvent):void { // Возвращаем назад gotoAndStop(1); } private function thisClick(e:MouseEvent):void { /* if (_root.money >= 20)//if the player has enough money { _root.makeTurret(this.x,this.y);//make the turret //remove all the listeners so it can't be clicked on again this.buttonMode = false; this.graphics.beginFill(0x333333); this.graphics.drawRect(0,0,25,25); this.graphics.endFill(); this.removeEventListener(MouseEvent.MOUSE_OVER, thisMouseOver); this.removeEventListener(MouseEvent.MOUSE_OUT, thisMouseOut); this.removeEventListener(MouseEvent.CLICK, thisClick); _root.money -= 20; //spend the money _root.removeChild(_root.rangeCircle); } */ } private function destroy(e:Event):void { this.removeEventListener(Event.REMOVED_FROM_STAGE, destroy); this.removeEventListener(MouseEvent.MOUSE_OVER, thisMouseOver); this.removeEventListener(MouseEvent.MOUSE_OUT, thisMouseOut); this.removeEventListener(MouseEvent.CLICK, thisClick); } } }
И третий класс DirectBlock.as – ячейка из которых будет состоять дорога по которой будут ходить враги
package com.byflasher.game.parts { import com.byflasher.game.levels.Levels; import flash.display.MovieClip; import flash.events.Event; public class DirectBlock extends DirectCell { private var directType:String; // Тип направления блока /* * type - направление ячейки * xVal - положение x * yVal - положение y */ public function DirectBlock(type:String, xVal:int, yVal:int) { directType = type; // Устанавливаем тип направления gotoRightFrame(directType); // Вызываем функцию, которая в зависимости от типа направления перейдет на соответствующие кадры this.addEventListener(Event.ADDED, beginClass); // Устанавливаем координаты this.x = xVal; this.y = yVal; } private function gotoRightFrame(_directType:String):void { if ( _directType == Levels.LD ) gotoAndStop(2); if ( _directType == Levels.LU ) gotoAndStop(5); if ( _directType == Levels.RD ) gotoAndStop(3); if ( _directType == Levels.RU ) gotoAndStop(4); } private function beginClass(e:Event):void { this.removeEventListener(Event.ADDED, beginClass); // Добавляем необходимые слушатели this.addEventListener(Event.ENTER_FRAME, enterFrameHandler); this.addEventListener(Event.REMOVED_FROM_STAGE, destroy); } private function enterFrameHandler(e:Event):void { // Здесь будет код пожже } private function destroy(e:Event = null):void { this.removeEventListener(Event.REMOVED_FROM_STAGE, destroy); this.removeEventListener(Event.ENTER_FRAME, enterFrameHandler); } } }
Ваш отзыв