![]() |
|
||||||||||
|
|||||
|
Регистрация: Jun 2014
Сообщений: 558
|
Доброго времени суток. Помогите с пулом, уже третью неделю бьюсь, с английским плохо, а на русском не нашёл достаточно толкового для меня объяснения (мал мой IQ). Да, на форуме искал, но у всех разная реализация и начинаю ещё больше путать. Теорию что такое пул я понимаю, мне он необходим, т.к. при нагрузках у меня присутствуют просадки фпс в игре, к тому же переделываю игру из кода в первом кадре в классы. Основу брал отсюда - как мне кажется тут самая простая реализация без выкрутасов. Вопросы начинаются начинается с того, что я не понимаю кода, пока мы создаём пул, так же его реализация, да и как потом с выведенными объектами общаться, мне и движение, и физика, и хиттест подключать будет нужно (но это потом, мож сам разберусь, если пойму как обращаться к отдельному элементу пула)
собственно есть два класса, ошибок проверка не выдаёт этот я выделил для пула 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 } } } 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, вдруг нужен для пояснения private function fn_fire_down(event: KeyboardEvent): void { if ((event.keyCode == 90) && (fire == true)) { } } заранее всем спасибо, кто выделил время и попытался осилить |
|
|||||
|
Видимо вы не понимаете до конца для чего используется пул. Пул нужен лишь для создания и хранения объектов которые часто и повторно используются в игре. Это могут быть любые объекты. Допустим это могут быть объекты пуль. Т.е. вы при создании пула указываете класс и количество экземпляров которое вам предположительно понадобится. Код пула из статьи вам совершенно не нужно менять. Если вам нужен пул, просто используйте этот код.
Допустим, у вас есть класс который описывает пулю (Bullet). В игре вы примерно представляете, что одновременно на экране могут быть не более 20 пуль, соответственно создаете пул с 20-тью экземплярами Bullet Здесь вы передали имя класса вашей пули и требуемый размер пула(код в статье позволяет создать объектов и больше указанного при создании если это будет необходимо) Т.е. теперь у вас есть "хранилище" в котором лежат 20 пуль. Когда вам требуется пуля вы достаете ее из этого хранилища. В хранилище(пул) может использоваться с любыми объектами потому getObject возвращает вам тип Object но поскольку вы знаете что в этом хранилище у вас пули(Bullet) вы приводите их к соответствующему типу оператором as. Теперь вы можете использовать свою пулю (добавить ее на сцену, "выстрелить", и т.п.) когда пуля "отработала" и больше не нужна на экране, вы должны вернуть ее в хранилище и удалить на нее ссылку Когда же вам потребуется пуля снова, вы проделываете все заново, а не создаете новый экземпляр Bullet. В целом, так и работает пул. |
|
|||||
|
Если по простому в коде отсюда вам не нужно ничего переделывать. Берете его готовым, и кладете в него свои классы (свои Bullet и прочие), ничего переписывать не нужно, это ваша ошибка.
Добавлено через 1 минуту Но судя по вопросам: Цитата:
|
|
|||||
|
Регистрация: Jun 2014
Сообщений: 558
|
PainKiller
Цитата:
хотя на счёт кода вы правы, ничего переделывать не надо, это универсальный код в примере, я что-то об этом сразу не подумал, т.к. в общей сложности мне нужно 3 пула, думал для каждого индивидуальный сделать. я в этой строке вижу объявление приватной переменной className типа Class, просто class и Class вещи разные, в теории className это универсальный класс, которому можно присвоить в итоге любой класс, я не понимаю за чем это нужно, код я прочитать могу, но мне не понятны моменты, я хочу понимать что я делаю и зачем Добавлено через 3 минуты здесь мне не нравится сама строчка, как я понимаю this.className это объявленный приватный класс, а className после равенства это тип класса, который передаётся при реализации. Добавлено через 3 минуты Партизан спасибо Добавлено через 31 минуту Но один вопрос остаётся открытым: как заставить bullet двигаться? Если я правильно понимаю, то нужно создать класс, который наследует bullet и расширить его как всеми необходимыми мне функциями и тогда при вызове класса из пула, то создаётся дубликат расширенного расширенного класса bullet. Пихаем их в ENTER_FRAME и наслаждаемся действием. Когда писал код в кадре, я просто создавал массив, вы который добавлял пульки, дальше каждый кадр крутил массив в цикде, что бы поменять координаты и когда не нужны, просто удалял. Классы для меня сложнее. Так же, а куда пихать реализацию, что-то мне кажется в классе main ей делать нечего. Мне казалось, что реализация должна быть как раз в расширенном классе bullet, но сейчас мне кажется это плохая идея и она работать не станет, то бишь создать отдельные класс? |
|
|||||
this.className //это обращение к ранее объявленной переменной private var className: Class; Для начала создайте сам класс пули(допустим Bullet) унаследуйтесь от нужного вам класса например Sprite или MovieClip. Опишите нужный вам фунционал в методах этого класса. Его уже можно пихать в пул и раз он унаследован от Sprite или MovieClip у его экземпляров будут унаследованные свойства и методы такие например как x,y. Далее нужно добавить экземпляр в DisplayList и двигайте как вам нужно. |
|
|||||
|
Когда я сказал что вы рано за это беретесь, я имел в виду что прочитайте для начала Колина Мука, а потом пробуйте писать игры с обжект пулом. Для успешного обучения нужно брать задачи по своему уровню.
|
|
|||||
|
Регистрация: Jun 2014
Сообщений: 558
|
PainKiller Мука читал, пока читал, писал пробную игру, чуть не умер со скуки, я просто не могу писать что-то, что мне не интересно, я лучше убью месяц, но напишу что мне интересное, хоть это и будет 2 строчки (так уже много раз было, когда только начал). У мука я что-то совсем не припомню ничего с пулами, да я бы не стал их делать, но начались тормоза в моём игрушке, причины простые, я создавал много объектов через цикл, которые жили 1-2 секунды и исчезали, да к тому же половина графики была векторная. В теории возможно достаточно было сменить вектор на растр, но захотелось научиться писать в классах, а в игре всего пока 650 строк кода, так что потихоньку перенесу. Да уже вижу удобства, не надо листать уйму кода в поисках нужного фрагмента, так же отдельный класс с основными параметрами значений, позволяет быстро менять значения, а не рыться в коде исправляя цифры.
Последний раз редактировалось neonoviiwolf; 08.12.2014 в 08:55. |
![]() |
![]() |
Часовой пояс GMT +4, время: 09:57. |
|
|
« Предыдущая тема | Следующая тема » |
|
|