0

Начав переводить комментарии к коду и вообще разбираться в самом коде стало понятно, что просто и быстро мне не отделаться… Я всего-лишь хотел заменить нарисованную кодом графику, на мувиклипы, добавить больше возможностей при создании разных уровней и перевести комментарии. Думал все будет легко и просто… А теперь фактически полностью потребуется переписывать код классов. Короче, начнем.

Пока нам потребуется 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);
 
		}
 
	}
}
Скачать исходник к первой части (250)

Ваш отзыв