Показать сообщение отдельно
Старый 11.02.2014, 21:20
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 4  
Ответить с цитированием
Akopalipsis
Banned

Регистрация: Mar 2013
Сообщений: 1,864
Код AS3:
package  
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.Loader;
	import flash.display.LoaderInfo;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.MouseEvent;
	import flash.net.URLRequest;
	public class TestClass extends Sprite
	{
		/*свойство показывающее сколько заряжать за один раз*/
		private const NUMBER_CANNONBALLS:int = 5;
		/*массив ядер которые находятся в списке отображения ( СО )*/
		private var _cannonballs:Array;
		/*массив в котором хранятся ядра*/
		private var _pool:Array;
		/*свойство хранящее длину массива ядер находящихся в СО*/
		private var _cannonballsCount:Number;
		/*свойство времени*/
		private var _time:Number;
		public function TestClass() 
		{
			//создаем массивы
			_cannonballs = [];
			_pool = [];
			//задаем норму времени, во флеш оно вроде в милисекундах..
			//тут  не понимаю и даже объяснять не буду
			_time = 1 * 0.001 * stage.frameRate;
 
			var loader:Loader = new Loader();
			loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, loader_ioError);
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_complete);
			loader.load(new URLRequest('../lib/cannonball.png'));
 
			stage.addEventListener(MouseEvent.CLICK, stage_click);
		}
		/*это если при загрузке будут ошибки*/
		private function loader_ioError(event:IOErrorEvent):void 
		{
			trace(event.errorID);
		}
		/*завершение загрузки*/
		private function loader_complete(event:Event):void 
		{
			//удаляем слушатели
			var loader:Loader = (event.target as LoaderInfo).loader;
			loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, loader_ioError);
			loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loader_complete);
 
			//сохраняем BitmapData загруженной картинки ядра
			var bitmapData:BitmapData = event.target.content.bitmapData as BitmapData;
			const cannonballCount:int = 10;//число указывающее сколько ядер нужно создать
			var cannonball:Bitmap;
			while (cannonballCount--)
			{
				cannonball = new Bitmap(bitmapData);//создаем объект cannonball
				//и помещаем его в массив, а в сам класс ядра передаём созданный объект 
				//ядра и ссылку на метод, который быдет вызываться их класса ядра
				_pool[cannonballCount] = new Cannonball(cannonball, this.prepareForPpool);
			}
		}
		/*этот метод вызывается из класса ядра по завершению полета ядра*/
		public function prepareForPpool(target:Cannonball):void
		{
			//так как ядро уже отлеталось, мы получаем его индекс в массиве
			//ядер находящихся в СО
			var index:int = _cannonballs.indexOf(target);
			this._cannonballs.splice(index, 1);//удаляем его и массива
			super.removeChild(target.target);//из СО
			this._pool.push(target);//помещаем на хранение в пул
			this._cannonballsCount = _cannonballs.length;//переназначаем значение свойству
			//которое показывает, сколько сейчас ядер в массиве объектов находящихся в СО
		}
		/*клик по сцене*/
		private function stage_click(event:MouseEvent):void 
		{
			if (!hasEventListener(Event.ENTER_FRAME))//если события нет
			{
				addEventListener(Event.ENTER_FRAME, enterFrame);//то подписываемся
			}
			this.shoot();//и стреляем
		}
		/**/
		private function shoot():void
		{
			var count:int = NUMBER_CANNONBALLS;//число заряжаемых за раз ядер
			var cannonballs:Cannonball;
			var n:int = 0;//свойство просто для примера, чтоб менять координаты
			if (_pool.length)//если есть свободные ядра
			{
				while (count--)
				{
					cannonballs = _pool[0];//присваеваем объект 
					_pool.splice(0, 1);//удаляем из пула
					cannonballs.setCoords(10, 100, n += 50, n);//задаем координаты
					_cannonballs.push(cannonballs);//помещаем в массив объектов в СО
					super.addChild(cannonballs.target);//добавляем в СО
					this._cannonballsCount = _cannonballs.length;//обнавляем значение свойства указывающего
					//сколько ядер в массиве 
				}
			}
		}
		/**/
		private function enterFrame(event:Event):void 
		{
			var cannonballObject:Cannonball;
			const cannonballCount:int = this._cannonballsCount;
			while (cannonballCount--)
			{
				cannonballObject = _cannonballs[cannonballCount];
				cannonballObject.move(_time);
 
				if (!_cannonballs.length) removeEventListener(Event.ENTER_FRAME, enterFrame);
			}
		}
 
 
	}
 
}
Код AS3:
package  
{
	import flash.display.Bitmap;
 
	public class Cannonball extends Object
	{
 
		public var target:Bitmap;//ядро 
		private var _prepareForPpool:Function;//метод по завершению
		// координаты
		private var _finishX:Number;
		private var _finishY:Number;
		private var _startX:Number;
		private var _startY:Number;
		//задержка
		private const DURATION:Number = 1;
		//растояние которое должно пролететь ядро перед удалением
		private var _distance:Number;
 
		public function Cannonball(target:Bitmap,prepareForPpool:Function) 
		{
			this.target = target;
			_prepareForPpool = prepareForPpool;
		}
		public function setCoords(startX:Number,finishX:Number,startY:Number,finishY:Number):void
		{
			_startX = startX;
			_startY = startY;
			_finishX = finishX - startX;
			_finishY = finishY - startY;
			_distance = 0;
		}
		public function move(time:Number):void
		{
			_distance +=  time;
			var ratio:Number = _distance  / DURATION;
			if (ratio >= 1)//если мы тут то ядро достигла финиша и мы удаляемся
			{
				target.x = _finishX * 1 + _startX;
				target.y = _finishY * 1 + _startY;
				_prepareForPpool(this);
			}
			target.x = _finishX *ratio + _startX;
			target.y = _finishY * ratio + _startY;
		}
 
	}
 
}


Последний раз редактировалось Akopalipsis; 11.02.2014 в 21:40.