Вторая итерация паттерна Pool для JavaScript. Вкратце, Pool — это место для хранения объектов, которые то появляются, то исчезают. Pool позволяет создать их заранее в нужном количестве, а затем повторно использовать, избегая вызова Garbage Collector. Паттерн, который необходим для гейм-девелопинга во всех языках с автоматической сборкой мусора.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
function Pool(size, objectCreateFunction) { this.freeAmount = 0; this.objects = []; this.add = function (object) { this.objects[this.freeAmount++] = object; }; for (var i = 0; i < size; i++) { this.add(objectCreateFunction()); // заполняем пул } this.get = function () { var newObj = null; // the pool contains objects : grab one if (this.freeAmount > 0) { this.freeAmount--; newObj = this.objects[this.freeAmount]; this.objects[this.freeAmount] = null; // очищаем массив } else { // the pool is empty : create new object newObj = objectCreateFunction(); } return newObj; }; this.free = function (object) { if (this.objects.indexOf(object) == -1) { this.add(object); } }; } |
Код я публикую на правах ревю. То есть публикация любого кода в моем блоге не означает, что он правильный и хороший. Критика приветствуется.
Пример использования Pool
Для всплывающих пузырьков в кликере — сначала создаю пул с пузырьками
1 2 3 |
this.pool = new Pool(this.POOL_SIZE, function () { return new FloatingLootElement(game) }); |
При запуске эффекта всплывания
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// запуск анимации лута FloatingLoot.prototype.float = function (x, y, lootType, lootValue) { var floater = this.pool.get(); // берем из пула floater.set(lootType, lootValue); // устанавливаем актуальные параметры // коллбэк по завершении анимации всплывания floater.setCallback(function () { this.pool.add(floater); // возвращаем в пул // ... }, this); floater.float(x, y); // старт анимации }; |
Zaxx чего у тебя свежие посты задним числом? Я что пропустил этот пост или ты его позже добавил? =) Надо будет прочитать чуть позже
Отличное решение Zaxx, но почему тебе не использовать нативное решение? Мне в проекте это не нужно было но, под твои нужды самое оно: создай группу в которую будешь добавлять пузырки и извлекаешь из нее первый «мертвый» объек пузырек. Если таков не найден (все в анимации или пока группа пустая) то создаем новый и добавляем в группу. Включаем для него анимацию, как только она закончиться, на oncomplete вешаем свой обработчик, который будет «убивать» пузырек. Фейзер автоматом не рисует мертвые объекты, но в памяти они есть.
п.с. забыл сказать что для поиска первого мертвого пузыря тоже есть метод в фейзере
я блин не пока знаю, может WordPress глючит
ты через RSS трекаешь обновления?
Да, это хороший способ, я подумаю.
Просто пока Phaser не отскакивает у меня от зубов — в смысле я не владею фреймворком на бессознательном уровне, как синьор
поэтому мой код, скорее всего, избыточен и более тяжел, чем мог быть в идеале
Еще я точно знаю, что в моем Pool есть и как он работает, у него минимум функций. А при добавлении объекта в группу задействуется много другой логики Phaser — это может стать источником багов.
Я старым дедовским способом трекаю — открываю твой сайт каждый день и смотрю нет ли новых постов
Конечно, можешь начать с своего пула, что бы лучше почувствовать Фейзер, но скажу что группы это единственное из за чего стоит ним пользоваться
Вот сейчас Элспер сказал, что кнопки сливаются с интерфесом. Только благодаря тому, что все элементы интерфейса у меня это отдельные группы, я за пару минут прикрутил к ним анимацию.
Не затягивай, как только освоишь группы, ничего без них делать не будешь
Но по началу я тоже не хотел ими пользоваться, но в конце все равно пришел к ним. Группа это тот же коасс, только для инкапсюляции элемента интерфейса.