Показать сообщение отдельно
Старый 23.01.2015, 21:56
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 2  
Ответить с цитированием
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 проще, если с индексами не баловаться