|
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
explбольшое спасибо, буду разбираться
но всё же хотел уточнить по своему коду, т.к. думаю, что это пулл или разубедите меня) в этой части кода идёт проверка на событие - выход за сцену, если событие обнаруженно, то я удаляю слушатель событий энтер_фрейм для bullet(без него она не летит, увы), долее вызываю vectorBullet.fn_push_pool(i), передавая туда индекс bullet с событием, в public function fn_push_pool (i):void{ я создаю новую ссылку на bullet в вектор, далее удаляю ссылку с индексом экземпляра bullet вектора который вышел за сцену 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; } } } } } а вот этот отрывок нужен, если длинна пула недостаточна, т.к. количество bullet у меня зависит лишь от скорости нажатия на клавишу (вдруг чего поменяю, типо двойные выстрелы), а пул тогда сам в процессе игры растянется |
|
|||||
О, я просветлел. Ваш вариант, похоже, действительно выполняет роль пула. Но как >_<
1. Вы перекидываете элементы, которые удалили в конец списка 2. Если надо добавить на экран объект, то вы производите интересное сравнение: 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; } } Кстати, это можно свести к коду ниже? Тут же рекурсия один раз только срабатывает? 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; } var i = vectorBullet.vectorPool.length; while (--i > -1) { if (vectorBullet.vectorPool[i] != null) { if (vectorBullet.vectorPool[i].stage != null) { Заключение: Если хотите поубавить лишней логики в коде: - попробуйте его написать без пула - потом добавить в места создания объекта вызов метода пула и в места удаления со сцены вызов другого метода пула (простому пулу больше 2-х методов не надо) Просто реально код мог бы быть раза в 2 проще, если с индексами не баловаться |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
expl спасибо, обязательно всё учту
по поводу индексов - это моя прихоть, я просто создал класс, в котором хранятся все основные значения, как скорости всех объектов, ихнии параметры поворота, их количество - приходится жертвовать красотой кода, но зато я могу менять всё, используя один класс и не трогая код |
|
|||||
Регистрация: Aug 2012
Сообщений: 23
|
относительно недавно написал вот такие "универсальные" классы для пулирования
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(); } } } } 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); } } } 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. Причина: вот ещё |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
iiiusion спасибо, буду разбираться
Появился вопрос, решил внять советам и в пул запихать спрайты, я правильно преобразовал? 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); } } D:\flash\InkWar\package_cl\Control_bullet_cl.as, строка 31, столбец 98 1119: Обращение возможного неопределенного свойства fn_speed через ссылку со статическим типом flash.display:Sprite . В этом коде я вешаю слушатель событий для экземпляра bullet, что бы он начал двигаться, в чём ошибка? Если в векторе мувики, то работает Последний раз редактировалось neonoviiwolf; 01.02.2015 в 21:47. |
Часовой пояс GMT +4, время: 06:01. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|