Показать сообщение отдельно
Старый 22.01.2015, 23:33
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 10  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Судя по всему у вас пул используется не для оптимизации, а чтобы хранить список объектов, причём как-то странно

Там есть забирание мувиклипов из буфера и набивание _новых_ мувиклипов в буффер(который зовется пулом почему-то), а так, чтобы повторно использовались удалённые с экрана мувиклипы - не нашёл

Как бы оно могло выглядеть вообще БЕЗ пула (логика изменена, т.к. маловато кода для её восстановления, идентификаторы переименованы чисто для себя - у вас слишком суровый стиль кодирования):

Код AS3:
//Пуля та же, только переименования
package package_cl {
	import flash.events.Event;
	import package_cl.GlobalVariables;
	public class Bullet extends bullet_mc {
		private var globalVariables: GlobalVariables = new GlobalVariables();
		public function Bullet() {
			addEventListener(Event.ADDED_TO_STAGE, onEnterFrame);
		}
		public function onEnterFrame(e: Event): void {
			x -= globalVariables.speed_bullet * Math.cos(rotation * Math.PI / 180);
			y -= globalVariables.speed_bullet * Math.sin(rotation * Math.PI / 180);
		}
	}
}
 
package package_cl {
	import flash.events.Event;
	import flash.display.Stage;
	import package_cl.MovieClipPool;
 
	public class BulletsController {
		private var stageX: int;
		private var stageY: int;
		private var _stage: Stage;
 
 		private var activeBullets:Vector.<Bullet> = new Vector.<Bullet>();// Это не пул, это просто список
 
		public function BulletsController(stage:Stage) {
			_stage = stage;
			stageX = _stage.stageHeight - 20;
			stageY = _stage.stageWidth - 20;
			_stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
 
		public function onEnterFrame(e: Event): void {
			spawnSomeBullets();
			removeInvisibleBullets();
		}
 
		private function spawnSomeBullets():void {
			// Вашу задумку не могу угадать, поэтому просто создадим 10 пуль
			for (var i:int = 0; i < 10; i++) {
				var bullet:Bullet = new Bullet();
				bullet.x = _x;
				bullet.y = _y;
				bullet.rotation = i * 30;
				// Не знаю зачем здесь слушатель ещё и на стейдж, но пусть будет
				_stage.addEventListener(Event.ENTER_FRAME, bullet.onEnterFrame)
				_stage.addChild(bullet);
				activeBullets.push(bullet);
			}
		}
 
		private function removeInvisibleBullets(): void {
			for (var i:int = activeBullets.length; i-- > 0;) // --> - оператор DownTo :)
			{
				Bullet bullet = activeBullets[i];
				if (bullet != null) {
					if (bullet.stage != null) {
						if (bullet.y > stageX || bullet.y < 150 || bullet.x > stageY || bullet.x < 10) {
							_stage.removeEventListener(Event.ENTER_FRAME, bullet.onEnterFrame);
							_stage.removeChild(bullet);
							activeBullets.splice(i, 1);
						}
					}
				}
			}
		}
	}
}
А теперь с "нормальным" пулом:
Код AS3:
package package_cl {
	import flash.events.Event;
	import flash.display.Stage;
	import package_cl.MovieClipPool;
 
	public class BulletsController {
		private var stageX: int;
		private var stageY: int;
		private var _stage: Stage;
 
 		private var activeBullets:Vector.<Bullet> = new Vector.<Bullet>();// Это не пул, это просто список
		private var pool = new BulletPool();// ИЗМЕНЕНИЕ 1
 
		public function BulletsController(stage:Stage) {
			_stage = stage;
			stageX = _stage.stageHeight - 20;
			stageY = _stage.stageWidth - 20;
			_stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
 
		public function onEnterFrame(e: Event): void {
			spawnSomeBullets();
			removeInvisibleBullets();
		}
 
		private function spawnSomeBullets():void {
			// Вашу задумку не могу угадать, поэтому просто создадим 10 пуль
			for (var i:int = 0; i < 10; i++) {
				var bullet:Bullet = pool.newBullet();// ИЗМЕНЕНИЕ 2
				bullet.x = _x;
				bullet.y = _y;
				bullet.rotation = i * 30;
				// Не знаю зачем здесь слушатель ещё и на стейдж, но пусть будет
				_stage.addEventListener(Event.ENTER_FRAME, bullet.onEnterFrame)
				_stage.addChild(bullet);
				activeBullets.push(bullet);
			}
		}
 
		private function removeInvisibleBullets(): void {
			for (var i:int = activeBullets.length; i-- > 0;) // --> - оператор DownTo :)
			{
				Bullet bullet = activeBullets[i];
				if (bullet != null) {
					if (bullet.stage != null) {
						if (bullet.y > stageX || bullet.y < 150 || bullet.x > stageY || bullet.x < 10) {
							_stage.removeEventListener(Event.ENTER_FRAME, bullet.onEnterFrame);
							_stage.removeChild(bullet);
							activeBullets.splice(i, 1);
							pool.releaseBullet();// ИЗМЕНЕНИЕ 3
						}
					}
				}
			}
		}
	}
}
 
package package_cl{
	import flash.display.MovieClip;
 
	public class BulletPool {
		private var vector:Vector.<Bullet> = new Vector.<Bullet>();
		public function BulletPool() {
		}
		public function newBullet():Bullet{
			if (vector.length > 0)
				return vector.pop();// pop удаляет последний элемент и возвращает его
			return new Bullet();
		}
		public function releaseBullet(movieClip:Bullet):void{
			vector.push(movieClip);
		}
	}
}
Код вряд ли рабочий (не проверял), но для чего нужен пул должно стать понятнее