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

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

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

Регистрация: Jun 2014
Сообщений: 558
По умолчанию Помогите разобраться с пулом

Доброго времени суток. Помогите с пулом, уже третью неделю бьюсь, с английским плохо, а на русском не нашёл достаточно толкового для меня объяснения (мал мой IQ). Да, на форуме искал, но у всех разная реализация и начинаю ещё больше путать. Теорию что такое пул я понимаю, мне он необходим, т.к. при нагрузках у меня присутствуют просадки фпс в игре, к тому же переделываю игру из кода в первом кадре в классы. Основу брал отсюда - как мне кажется тут самая простая реализация без выкрутасов. Вопросы начинаются начинается с того, что я не понимаю кода, пока мы создаём пул, так же его реализация, да и как потом с выведенными объектами общаться, мне и движение, и физика, и хиттест подключать будет нужно (но это потом, мож сам разберусь, если пойму как обращаться к отдельному элементу пула)
собственно есть два класса, ошибок проверка не выдаёт
этот я выделил для пула
Код AS3:
package package_cl {
 
	import flash.display.Sprite;
	import package_cl.bullet_cl;
 
	public class pool_bullet_cl {
		private var pool:Vector.<bullet_mc>; // так можно мувик кинуть?
		private var counter: uint;
		private var className: Class; //вообще не понимаю что эта строка делает и для чего она
 
		public function pool_bullet_cl(className: Class, length: uint = 1) { //как понимаю, передаём тип объекта (я кинул Sprite) и длину пула
			this.className = className; //что мы этим хотим сказать:
			pool = new Vector.<bullet_mc>(length); //как понимаю, тут я создаю пул из мувиков в количестве length
 
			var i: uint = counter = length;  // готовимся к циклу, но что делает этот цикл? мы же вроде строчкой выше создали pool  из мувиков с заданной длинной
 
			while (--i > -1){
				pool[i] = new className();
			}
		}
		public function get_bullet (): bullet_mc{  // в примере возвращает обджект, мой мувик сойдёт?
			if (counter > 0){                           // если счётчик больше нуля то выполнить?? что даёт следующая строка? Вроде пропускаем код функции, что в данном случаи делает счётчик пула?
				return pool [--counter];
			}
			pool.unshift (new className());   //если я правильно понял, тут мы добавляем новый элемент в пул, только почему className?
			return pool [0];   //прерывание функции, опять пул с индексом "0" - что это даёт?
		}
		public function release_bullet (value: bullet_mc): void{  //это зачем? что эта функция делает?
			pool[++counter] = value
		}
	}
}
второй, должна происходит вроде реализация пула

Код AS3:
package package_cl {
	import flash.geom.Point;
	import package_cl.pool_bullet_cl;
	import flash.display.Sprite;
 
	public class bullet_cl {
		public var pool: pool_bullet_cl = new pool_bullet_cl(Sprite, 150);  //ну это я написал, тут получается мы отправляем в предыдущий класс тип объектов и их количество?
 
 
		public function bullet_cl() {
			for (var i: int = 0, p: Sprite; i < 40; ++i){  //нуждаюсь в расшифровке, что тут вообще происходит? Делаем счётчик, почему до 40? (наверно чисто пример реализации)
				p = pool.get_bullet() as Sprite;  //тут мы что делаем? Для переменной p вызываем функцию и тип объекта спрайт? Не очень понимаю что означает "as"
			}
		}
	}
}
возможно я напортачил, пока переделывал классы под себя, но ошибок не пишет, так что не могу узнать, т.к. сначала нужно понять как это всё работает. Так же могли бы пояснить: есть класс ship в котором есть слушатель события нажатия на клавишу, после обнаружения как раз и нужно вытащить один bullet из пула, так же мне необходимо, что бы он двигался, как мне определить добавленные bullet на сцену, что бы можно было изменять их координаты.

отрывок вызова из класса ship, вдруг нужен для пояснения
Код AS3:
		private function fn_fire_down(event: KeyboardEvent): void {
			if ((event.keyCode == 90) && (fire == true)) {
			}
		}
Добавлено через 2 минуты
заранее всем спасибо, кто выделил время и попытался осилить

Старый 05.12.2014, 10:53
Партизан вне форума Посмотреть профиль Отправить личное сообщение для Партизан Найти все сообщения от Партизан
  № 2  
Ответить с цитированием
Партизан
 
Аватар для Партизан

блогер
Регистрация: Nov 2007
Адрес: Almaty, Moscow
Сообщений: 396
Записей в блоге: 5
Отправить сообщение для Партизан с помощью Skype™
Видимо вы не понимаете до конца для чего используется пул. Пул нужен лишь для создания и хранения объектов которые часто и повторно используются в игре. Это могут быть любые объекты. Допустим это могут быть объекты пуль. Т.е. вы при создании пула указываете класс и количество экземпляров которое вам предположительно понадобится. Код пула из статьи вам совершенно не нужно менять. Если вам нужен пул, просто используйте этот код.
Допустим, у вас есть класс который описывает пулю (Bullet). В игре вы примерно представляете, что одновременно на экране могут быть не более 20 пуль, соответственно создаете пул с 20-тью экземплярами Bullet
Код AS3:
var pool:ObjectPool = new ObjectPool(Bullet, 20);
Здесь вы передали имя класса вашей пули и требуемый размер пула(код в статье позволяет создать объектов и больше указанного при создании если это будет необходимо)
Т.е. теперь у вас есть "хранилище" в котором лежат 20 пуль.
Когда вам требуется пуля вы достаете ее из этого хранилища.
Код AS3:
var bullet:Bullet = pool.getObject() as Bullet;
В хранилище(пул) может использоваться с любыми объектами потому getObject возвращает вам тип Object но поскольку вы знаете что в этом хранилище у вас пули(Bullet) вы приводите их к соответствующему типу оператором as. Теперь вы можете использовать свою пулю (добавить ее на сцену, "выстрелить", и т.п.) когда пуля "отработала" и больше не нужна на экране, вы должны вернуть ее в хранилище
Код AS3:
pool.releaseObject(bullet);
и удалить на нее ссылку
Код AS3:
bullet = null;
Когда же вам потребуется пуля снова, вы проделываете все заново, а не создаете новый экземпляр Bullet.

В целом, так и работает пул.

Старый 05.12.2014, 11:09
PainKiller вне форума Посмотреть профиль Отправить личное сообщение для PainKiller Найти все сообщения от PainKiller
  № 3  
Ответить с цитированием
PainKiller
 
Аватар для PainKiller

блогер
Регистрация: Sep 2011
Адрес: Москва
Сообщений: 533
Записей в блоге: 4
Если по простому в коде отсюда вам не нужно ничего переделывать. Берете его готовым, и кладете в него свои классы (свои Bullet и прочие), ничего переписывать не нужно, это ваша ошибка.

Добавлено через 1 минуту
Но судя по вопросам:
Цитата:
private var className: Class; //вообще не понимаю что эта строка делает и для чего она
вы рано за это беретесь, учите основы.

Старый 05.12.2014, 16:34
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 4  
Ответить с цитированием
neonoviiwolf

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

хотя на счёт кода вы правы, ничего переделывать не надо, это универсальный код в примере, я что-то об этом сразу не подумал, т.к. в общей сложности мне нужно 3 пула, думал для каждого индивидуальный сделать.
Код AS3:
private var className: Class; //вообще не понимаю что эта строка делает и для чего она
я в этой строке вижу объявление приватной переменной className типа Class, просто class и Class вещи разные, в теории className это универсальный класс, которому можно присвоить в итоге любой класс, я не понимаю за чем это нужно, код я прочитать могу, но мне не понятны моменты, я хочу понимать что я делаю и зачем

Добавлено через 3 минуты
Код AS3:
this.className = className; //что мы этим хотим сказать:
здесь мне не нравится сама строчка, как я понимаю this.className это объявленный приватный класс, а className после равенства это тип класса, который передаётся при реализации.

Добавлено через 3 минуты
Партизан спасибо

Добавлено через 31 минуту
Но один вопрос остаётся открытым: как заставить bullet двигаться? Если я правильно понимаю, то нужно создать класс, который наследует bullet и расширить его как всеми необходимыми мне функциями и тогда при вызове класса из пула, то создаётся дубликат расширенного расширенного класса bullet. Пихаем их в ENTER_FRAME и наслаждаемся действием. Когда писал код в кадре, я просто создавал массив, вы который добавлял пульки, дальше каждый кадр крутил массив в цикде, что бы поменять координаты и когда не нужны, просто удалял. Классы для меня сложнее.
Так же, а куда пихать реализацию, что-то мне кажется в классе main ей делать нечего. Мне казалось, что реализация должна быть как раз в расширенном классе bullet, но сейчас мне кажется это плохая идея и она работать не станет, то бишь создать отдельные класс?

Старый 05.12.2014, 17:31
Партизан вне форума Посмотреть профиль Отправить личное сообщение для Партизан Найти все сообщения от Партизан
  № 5  
Ответить с цитированием
Партизан
 
Аватар для Партизан

блогер
Регистрация: Nov 2007
Адрес: Almaty, Moscow
Сообщений: 396
Записей в блоге: 5
Отправить сообщение для Партизан с помощью Skype™
Код AS3:
this.className //это обращение к ранее объявленной переменной private var className: Class;
className из параметров конструктора имеет то же имя что и у private var className: Class; читайте про область видимости переменных.

Для начала создайте сам класс пули(допустим Bullet) унаследуйтесь от нужного вам класса например Sprite или MovieClip. Опишите нужный вам фунционал в методах этого класса. Его уже можно пихать в пул и раз он унаследован от Sprite или MovieClip у его экземпляров будут унаследованные свойства и методы такие например как x,y. Далее нужно добавить экземпляр в DisplayList и двигайте как вам нужно.

Старый 07.12.2014, 19:37
PainKiller вне форума Посмотреть профиль Отправить личное сообщение для PainKiller Найти все сообщения от PainKiller
  № 6  
Ответить с цитированием
PainKiller
 
Аватар для PainKiller

блогер
Регистрация: Sep 2011
Адрес: Москва
Сообщений: 533
Записей в блоге: 4
Когда я сказал что вы рано за это беретесь, я имел в виду что прочитайте для начала Колина Мука, а потом пробуйте писать игры с обжект пулом. Для успешного обучения нужно брать задачи по своему уровню.

Старый 08.12.2014, 08:05
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 7  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
PainKiller Мука читал, пока читал, писал пробную игру, чуть не умер со скуки, я просто не могу писать что-то, что мне не интересно, я лучше убью месяц, но напишу что мне интересное, хоть это и будет 2 строчки (так уже много раз было, когда только начал). У мука я что-то совсем не припомню ничего с пулами, да я бы не стал их делать, но начались тормоза в моём игрушке, причины простые, я создавал много объектов через цикл, которые жили 1-2 секунды и исчезали, да к тому же половина графики была векторная. В теории возможно достаточно было сменить вектор на растр, но захотелось научиться писать в классах, а в игре всего пока 650 строк кода, так что потихоньку перенесу. Да уже вижу удобства, не надо листать уйму кода в поисках нужного фрагмента, так же отдельный класс с основными параметрами значений, позволяет быстро менять значения, а не рыться в коде исправляя цифры.


Последний раз редактировалось neonoviiwolf; 08.12.2014 в 08:55.
Создать новую тему Ответ Часовой пояс GMT +4, время: 10:17.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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