Часть 5. Добавление врагов | В паутине

Часть 5. Добавление врагов

Вольный перевод статьи How to Create a Platform Game in AS3 – Part 5 Часть комментариев (особенно по математическим расчетам) - моя.

Следующий шаг в создании нашего замечательного Flash-платформера – добавление врагов. Работая над этой задачей, мы, прежде всего, должны создать отдельный класс Enemy. Для этого создадим новый файл ActionScript и назовем его Enemy.as. Код, который необходимо в нем разместить, очень похож на код предыдущего созданного нами класса Block.

package{
	import flash.display.Sprite;
	import flash.display.MovieClip;
	import flash.display.Shape;
	import flash.display.DisplayObject;
	import flash.events.*;
 
	//спрайты – это те же МувиКлипы, только без шкалы времени
	public class Enemy extends Sprite{
		//переменная ссылается на корень приложения
		private var _root:Object;
		//скорость врагов
		private var speed:Number;
		//направление движения:
		//-1 - влево, 1 - вправо
		private var direction:int;
 
		public function Enemy(){
			//выполняется только один раз при добавлении
			addEventListener(Event.ADDED, beginClass);
			//выполняется в каждом кадре
			addEventListener(Event.ENTER_FRAME, eFrame);
		}
 
		private function beginClass(event:Event):void{
			//определяем корневой элемент
			_root = MovieClip(root);
			//устанавливаем скорость и направление 
			speed = 5;
			direction = 1;
			//рисуем врага (красный кружок)
			this.graphics.beginFill(0xFF0000,1);
			this.graphics.drawCircle(12.5,12.5,12.5);
		}
 
		private function eFrame(event:Event):void{
 
		}
	}
}

Этот код создает врага в виде красного круга и добавляет его на сцену. Прежде чем написать обработчик события смены кадров, следует добавить на главную временную линию код, который будет добавлять согласно схеме уровня на сцену врага и кроме того специальные маркеры, обозначающие место, где враг должен разворачиваться. Условное обозначение самого врага – «5», его маркеров – «6».
Следующий код необходимо добавить в цикл функции createLvl():

if (lvlArray[i] == 5){
	//добавляем врага
	newPlacement = new Enemy();
	enemyHolder.addChild(newPlacement);
} else if (lvlArray[i] == 6){
	//добавляем невидимые маркеры мест поворота
	newPlacement = new Shape();
	newPlacement.graphics.beginFill(0x000000,0);
	newPlacement.graphics.drawRect(0,0,25,25);
	invisMarkerHolder.addChild(newPlacement);
}

Конечно, нам необходимо создать сами контейнеры invisMarkerHolder и enemyHolder. Надеюсь, вы сможете сделать это самостоятельно. Просто повторите в точности то, что мы делали при добавлении других контейнеров за исключением имени.
Изменим схему уровня:

var lvlArray1:Array = new Array(
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,6,0,0,0,0,0,5,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,4,0,0,0,X,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
);

Теперь мы можем добавить врагам реальную функциональность. Вот так будет выглядеть обработчик события смены кадров, который необходимо добавить в файл Enemy.as:

private function eFrame(event:Event):void{
	//движение врага
	this.x += speed * direction;
	//проверка на достижение
	for(var i:int=0;i<_root.invisMarkerHolder.numChildren;i++){ var targetMarker:DisplayObject = _root.invisMarkerHolder.getChildAt(i); if(hitTestObject(targetMarker)){ //при достижении маркера меняем направление direction *= -1; this.x += speed * direction; } } //столкновение врага с персонажем if(this.hitTestObject(_root.mcMain)){ //если персонаж падает сверху if(_root.mainJumping && _root.jumpSpeed > 0){
			//убить врага
			this.parent.removeChild(this);
			//удалить слушатель события
			this.removeEventListener(Event.ENTER_FRAME, eFrame);
		} else {
			//иначе убить персонажа
			//позже мы добавим кадр смерти
			trace('OH NO! You died!');
		}
	}
}

Запустив программу, вы должны увидеть красный круг, двигающийся над платформой выше вашего персонажа. Если вы столкнетесь в ним, в строке вывода появится надпись о вашей смерти. Если вы прыгнете на врага, он исчезнет. Изящно, не правда ли?
Теперь необходимо написать функцию, которая будет прекращать игру, если главный герой погибнет. Добавьте этот код на главную линию времени:

function resetLvl():void{
	for(var i:int=0;i<lvlHolder.numChildren;i++){ //выбираем текущий контейнер var currentContainer = lvlHolder.getChildAt(i); //удаляем все его содержимое while(currentContainer.numChildren > 0){
			for(var i2:int = 0;i2<currentContainer.numChildren;i2++){
				currentContainer.removeChildAt(i2);
			}
		}
	}
	//пересоздаем уровень, передвигаем lvlHolder
	lvlHolder.x = 0;
	createLvl();
}

Теперь мы можем использовать эту функцию, если персонаж столкнулся с врагом или упал за пределы сцены. Оставляю решение этой задачи вам.
Вот, в принципе, и все, что касается создания врагов. В следующий раз мы фактически соберем полноценную игру.

Все уроки руководства

1. Создание главного персонажа
2. Создание уровня
3. Взаимодействие персонажа с блоками
4. Добавление элементов уровня
5. Добавление врагов
6. Завершение уровня
7. Последние штрихи

Комментарии (0)

Ваш email не будет опубликован. Все поля обязательны