Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 23.01.2015, 02:20
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 11  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
explбольшое спасибо, буду разбираться
но всё же хотел уточнить по своему коду, т.к. думаю, что это пулл или разубедите меня)

в этой части кода идёт проверка на событие - выход за сцену, если событие обнаруженно, то я удаляю слушатель событий энтер_фрейм для bullet(без него она не летит, увы), долее вызываю vectorBullet.fn_push_pool(i), передавая туда индекс bullet с событием, в public function fn_push_pool (i):void{ я создаю новую ссылку на bullet в вектор, далее удаляю ссылку с индексом экземпляра bullet вектора который вышел за сцену
Код AS3:
public function fn_null_bullet(e: Event): void {
			var i = vectorBullet.vectorPool.length;
			while (--i > -1) {
				if (vectorBullet.vectorPool[i] != null) {
					if (vectorBullet.vectorPool[i].stage != null) {
						if (vectorBullet.vectorPool[i].y > stageX || vectorBullet.vectorPool[i].y < 150 || vectorBullet.vectorPool[i].x > stageY || vectorBullet.vectorPool[i].x < 10) {
							_stage.removeEventListener(Event.ENTER_FRAME, vectorBullet.vectorPool[i].fn_speed);
							vectorBullet.fn_push_pool(i);
							_stage.removeChild(vectorBullet.vectorPool[i]);
							vectorBullet.vectorPool[i] = null;
							vectorBullet.vectorPool.splice(i, 1);
							--gl_variable.index_bullet;
						}
					}
				}
			}
		}
собственно я тут не создаю новый объект, просто меняю ссылки, уверен, можно проще, но пока так, минусы в производительности мне трудно оценить, так как я в процессе игры дергаю вектор
Код AS3:
}
		public function fn_push_pool (i):void{
			vectorPool.push(vectorPool[i]);
 
		}
а вот этот отрывок нужен, если длинна пула недостаточна, т.к. количество bullet у меня зависит лишь от скорости нажатия на клавишу (вдруг чего поменяю, типо двойные выстрелы), а пул тогда сам в процессе игры растянется
Код AS3:
public function fn_add_pool ():void{
			var vectorMovieClip = movieClip;
			vectorPool.push(vectorMovieClip);
		}

Старый 23.01.2015, 21:56
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 12  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
О, я просветлел. Ваш вариант, похоже, действительно выполняет роль пула. Но как >_<

1. Вы перекидываете элементы, которые удалили в конец списка

2. Если надо добавить на экран объект, то вы производите интересное сравнение:
Код AS3:
		public function fn_fire_up(_x, _y, _rotation): void {
			if (gl_variable.index_bullet == vectorBullet.vectorPool.length) {
				vectorBullet.fn_add_pool();
				fn_fire_up(_x, _y, _rotation); //рекурсия
			} else {
				vectorBullet.vectorPool[gl_variable.index_bullet].x = _x;
				vectorBullet.vectorPool[gl_variable.index_bullet].y = _y;
				vectorBullet.vectorPool[gl_variable.index_bullet].rotation = _rotation;
				_stage.addEventListener(Event.ENTER_FRAME, vectorBullet.vectorPool[gl_variable.index_bullet].fn_speed)
				_stage.addChild(vectorBullet.vectorPool[gl_variable.index_bullet]);
				++gl_variable.index_bullet;
			}
		}
Здесь не очевидно почему vectorBullet.vectorPool[gl_variable.index_bullet] - это Bullet, который сейчас не на экране, хотя, наверно, оно так и есть O_o

Кстати, это можно свести к коду ниже? Тут же рекурсия один раз только срабатывает?
Код AS3:
		public function fn_fire_up(_x, _y, _rotation): void {
			if (gl_variable.index_bullet == vectorBullet.vectorPool.length) {
				vectorBullet.fn_add_pool();
			} 
			vectorBullet.vectorPool[gl_variable.index_bullet].x = _x;
			vectorBullet.vectorPool[gl_variable.index_bullet].y = _y;
			vectorBullet.vectorPool[gl_variable.index_bullet].rotation = _rotation;
			_stage.addEventListener(Event.ENTER_FRAME, vectorBullet.vectorPool[gl_variable.index_bullet].fn_speed)
			_stage.addChild(vectorBullet.vectorPool[gl_variable.index_bullet]);
			++gl_variable.index_bullet;
		}
3. Вы используете список пула чтобы реализовывать логику вашего приложения. Всё в одной куче, и поэтому у вас много проверок в цикле
Код AS3:
var i = vectorBullet.vectorPool.length;
			while (--i > -1) {
				if (vectorBullet.vectorPool[i] != null) {
					if (vectorBullet.vectorPool[i].stage != null) {
Ещё какие-то поля индексов у пуль, они же нужны только для работы с пулом, угадал?

Заключение:

Если хотите поубавить лишней логики в коде:
- попробуйте его написать без пула
- потом добавить в места создания объекта вызов метода пула и в места удаления со сцены вызов другого метода пула (простому пулу больше 2-х методов не надо)

Просто реально код мог бы быть раза в 2 проще, если с индексами не баловаться

Старый 23.01.2015, 22:15
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 13  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
expl спасибо, обязательно всё учту
по поводу индексов - это моя прихоть, я просто создал класс, в котором хранятся все основные значения, как скорости всех объектов, ихнии параметры поворота, их количество - приходится жертвовать красотой кода, но зато я могу менять всё, используя один класс и не трогая код

Старый 27.01.2015, 20:04
iiiusion вне форума Посмотреть профиль Отправить личное сообщение для iiiusion Найти все сообщения от iiiusion
  № 14  
Ответить с цитированием
iiiusion

Регистрация: Aug 2012
Сообщений: 23
относительно недавно написал вот такие "универсальные" классы для пулирования
Код AS3:
package igine.core {
 
	import flash.utils.getQualifiedClassName;
 
	public class PoolsStorage {
 
		public var pools:Object = {};
 
		private static var _instance:PoolsStorage;
 
		public static function get instance():PoolsStorage {
			if (!_instance) _instance = new PoolsStorage();
			return _instance;
		}
 
		public function createPool(objectClass:Class, number:uint, poolName:String):void {
			var pool:Pool = new Pool();
			for (var i:int = 0; i < number; i++) {
				pool.addNewObject(new objectClass);
			}
			pools[poolName] = pool;
		}
 
		public function getPool(key:String):Pool {
			if (pools[key]) {
				return pools[key]
			} else {
				trace(getQualifiedClassName(this) + ": pool by key '", key, "' not found!");
				return null;
			}
		}
 
		public function recoveryAllPool():void {
			for each(var pool:Pool in pools) {
				pool.recovery();
			}
		}
 
	}
 
}
Код AS3:
package igine.core {
	public class Pool {
		private var recoveryPool:Array = [];
		private var workPool:Array = [];
 
		public function addNewObject(object:*):void {
			recoveryPool.push(object);
			workPool.push(object);
		}
 
		public function recovery():void {
			for each (var object:* in recoveryPool) {
				if (workPool.indexOf(object) == -1) {
					workPool.push(object);
				}
			}
		}
 
		public function getObject():* {
			if (workPool.length > 0) {
				return workPool.pop();
			}
		}
 
		public function get poolLength():uint {
			return workPool.length;
		}
 
		public function replaceObject(object:*):void {
			workPool.push(object);
		}
 
	}
}
а работа с объектами через вот такой контроллер
Код AS3:
package igine.core {
	import flash.utils.getQualifiedClassName;
 
	public class ObjectController {
		protected var array:Array;
		protected var pool:Pool;
		protected var poolLength:uint = 0;
		protected var arrayLength:uint = 0;
		protected var poolKey:String;
 
		protected var tickInterval:uint = 1;
		protected var tickIntervalCounter:uint = 0;
 
		public function ObjectController(poolKey:String, tickInterval:uint = 1) {
			pool = PoolsStorage.instance.getPool(poolKey);
			poolLength = pool.poolLength;
			this.poolKey = poolKey;
			this.tickInterval = tickInterval;
 
			array = [];
			arrayLength = array.length;
		}
 
		public function execute():void {
			tickIntervalCounter++;
			if (tickIntervalCounter < tickInterval) return;
 
			tickIntervalCounter = 0;
 
			for (var i:int = 0; i < arrayLength; i++) {
				array[i].execute();
			}
			for (var i1:int = 0; i1 < array.length; i1++) {
				if (array[i1].toRemove) {
					pool.replaceObject(array[i1]);
					array[i] = array[arrayLength - 1];
					array.length--;
					poolLength++;
					arrayLength--;
				}
			}
		}
 
		public function setTickInterval(value:uint):void {
			this.tickInterval = value;
		}
 
		public function recoveryPool():void {
			pool.recovery();
		}
 
		public function addObject(objectModel:*):* {
			if (poolLength > 0) {
				var object:* = pool.getObject();
				object.cloneModel(objectModel);
				array.push(object);
				arrayLength++;
				poolLength--;
				return object;
			} else {
				trace(getQualifiedClassName(this) + ": " + poolKey + " pool is empty!")
			}
			return null;
		}
	}
}


Последний раз редактировалось iiiusion; 27.01.2015 в 20:08. Причина: вот ещё
Старый 01.02.2015, 20:45
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 15  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
iiiusion спасибо, буду разбираться
Появился вопрос, решил внять советам и в пул запихать спрайты, я правильно преобразовал?
Код AS3:
		public function Vector_Pool_cl(_lengthVector: int, _movieClip: MovieClip) {
			lengthVector = _lengthVector;
			movieClip = _movieClip;
			var i = lengthVector;
			var movieClipDef:Class = MovieClip(movieClip).constructor;
			while (--i > -1){
				var movieClipView: Sprite = new movieClipDef () as Sprite;
				vectorPool.push(movieClipView);
			}
		}
появилась проблема, если в векторе вместо мувиков написать Sprite, то выдаёт
D:\flash\InkWar\package_cl\Control_bullet_cl.as, строка 31, столбец 98 1119: Обращение возможного неопределенного свойства fn_speed через ссылку со статическим типом flash.display:Sprite .
Код AS3:
_stage.addEventListener(Event.ENTER_FRAME, vectorBullet.vectorPool[gl_variable.index_bullet].fn_speed)
В этом коде я вешаю слушатель событий для экземпляра bullet, что бы он начал двигаться, в чём ошибка? Если в векторе мувики, то работает


Последний раз редактировалось neonoviiwolf; 01.02.2015 в 21:47.
Создать новую тему Ответ Часовой пояс GMT +4, время: 06:01.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 06:01.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.