Phaser - полезные советы

Часть 25: Хранение состояния игры в самих объектах

Создание игры в framework-е требует смену мышления. Для примера я возьму принцип хранения данных в играх. При проектировании не игровой программы, вы храните данные в базе, массивах и сложных структурах. А ваша задача, написать код, который будет манипулировать этими данными и выводить результат на экран, обрабатывать входящие события (то рекомендую почитать о MVC модели проектирования программы).

При проектировании в Phaser, дело обстоит не совсем так. Создав первую игровую сцену я понял, что необходимости в дополнительных структурах хранения данных нет! Каждый объект сцены можно воспринимать как ячейку для хранения данных. Если объект удалили со сцены, то и удалили все данные связанные с ним (что вполне логично). Также каждый объект имеет независимые свойства, которые позволяют ему независимо от других, «жить» в мире игры и взаимодействовать с ней.

Давайте разберем пример платформера, где персонаж должен собрать монетки. Для этого: персонаж должен уметь перемещаться (считывать события нажатия на определенных клавиш клавиатуры). А также надо создать группу, которая будет содержать всего его части (если он составной: руки, ноги, тело, голова и т.д.). Монетки надо будет добавлять в группу монеток. Обратите внимание, после добавления монетки на определенное место сцены, нам не надо больше думать о ней. Если она анимаированная, то этим будет заниматься сама монетка, а не главный код игры.

Нашей задачей является только проверка соприкосновения группы главного персонажа и монеток. Phaser делает это автоматически и нам остаеться только обработать такое событие: удалить монетку, увеличить счет пользователя.

А теперь реальный пример в моей игре. Как вы помните, если пользователь отвечал правильно на карточку, то она удалялась из колоды. Но после того, как я показал все карточки в колоде, надо было повторить процесс, но уже с отвеченными неправильно. В предыдущей версии игры, которую я написал без Phaser, мне приходилось использовать массив для хранения правильных и не правильных ответов. Но в Phaser все оказалось намного проще… ведь у меня была физически группу с карточками на экране (отвеченными неправильно). По этому, достаточно было использовать метод group.getRandom(), что бы получить случайную карточку (отвеченную не правильно) и показать ее игроку. Отпала необходимость вести внутренний учет состояния игры.

Как видите, Phaser позволяет перевести логику разработки игры в другую плоскость. Объекты на сцене надо воспринимать не как визуальное отражение состояния данных в программе, а как независимые элементы живущие в мире сцены. А как вы воспринимаете элементы игры?

4 thoughts on “Часть 25: Хранение состояния игры в самих объектах

  1. Я разрываюсь между вариантами «создавать независимые модели и логику» и «создавать логику сразу на базе объектов фреймворка».

    В первом случае возникает как бы чистый код, но нужны дополнительные обвязки, чтобы чистая модель превратилась в объекты на сцене.

    Во втором случае, объекты фреймворка уже с собой несут кучу свойств.

    Вероятно, идеальным является какой-то баланс. В чистой модели хранятся только совсем абстрактные вещи, а в объектах-реализациях их свойства, которые имеют значения во время их жизни, к примеру.

  2. Я вот пробовал создавать свои объекты, но тогда тебе приодеться писать логику поиска нужных данных самостоятельно. А если использовать объекты самой системы, то при нажатии на кнопку к примеру, у тебя уже в кнопке храниться информация о ней (как например у меня с окошком магазина, там в каждой кнопке информация сколько покупает и сколько за это платит). Но при этом есть один главный объект Profile пользователя, где храниться все данные. Но даже к нему доступ происходит через game.profile. Зачем я так сделал? Дело в том что у меня есть гарантия что game будет всегда доступна… а через нее можно добраться до нужной мне переменной. Вот ты правильно написал «а в объектах-реализациях их свойства, которые имеют значения во время их жизни, к примеру»

  3. поясню, чтобы не пугать

    localStorage отлично работает на десктопах
    на мобильном Хроме (последнем!) в Андроид 4.4 — не сохраняет между сессиями
    в пятой версии андроида все уже ок

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *