![Page 1: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/1.jpg)
Быстрое прототипированиебэкенда игры с геолокациейна OpenResty, Redis и Docker
Александр ГладышCTO, LogicEditor
![Page 2: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/2.jpg)
План доклада1. Кейс
2. Задача
3. Философия
4. План разработки
5. Docker
6. HTTP API
7. Устройство игрового мира
8. Демонстрация
9. Клиент
10. Итоги
11. Вопросы?
2 / 63
![Page 3: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/3.jpg)
Обо мне
• В разработке ПО с 2002-го,• большую часть этого времени — в геймдеве (разработка,проектирование, управление),
• вне геймдева — нагруженные интернет-решения, enterprise ПО и др.• Организатор meetup.com/Lua-in-Moscow
3 / 63
![Page 4: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/4.jpg)
Мобильные игры с геолокацией
4 / 63
![Page 5: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/5.jpg)
Цели прототипирования в общем
• Проверить ряд подходов к построению игрового процесса,• выработать новые идеи,• найти, в чём фан, а в чём — нет.
5 / 63
![Page 6: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/6.jpg)
Цели технологической части прототипирования
• С минимальными затратами получить код,• дающий возможность быстро итерироваться по вариантам геймплея.• Прояснить на практике технические ограничения жанра.
6 / 63
![Page 7: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/7.jpg)
Результаты
За два календарных месяца (менее 100 человеко-часов) разработан прототипсерверной части игры с геолокацией и рудиментарный клиент для неё.
Ведётся быстрое итерирование по вариантам построения игрового процессаи дальнейшая разработка технологической части проекта.
7 / 63
![Page 8: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/8.jpg)
О чём этот доклад?
• Доклад — технологической части проекта,• не о геймдизайне• и не о монетизации.
8 / 63
![Page 9: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/9.jpg)
Зачем этот доклад?
Делать игры с геолокацией сейчас проще чем когда-либо.
Я покажу с чего можно начать.
9 / 63
![Page 10: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/10.jpg)
Задача
• Максимально быстро написать сервер для быстрого прототипирования.• Параллельно с сервером реализовать минимальный клиент.• Проверять гипотезы уже во время написания, если возможно.• Выявить основные технические ограничения на проект.
10 / 63
![Page 11: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/11.jpg)
Стадии разработки
• Препродакшен• Продакшен• Поддержка
11 / 63
![Page 12: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/12.jpg)
Стадии разработки: Препродакшен
• Препродакшен• Поиск геймплея, эскизы, выяснение ограничений.• Более глубокая проработка удачных вариантов геймплея.• Подготовка к продакшену выбранного варианта.
12 / 63
![Page 13: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/13.jpg)
Продакшен: приоритеты разработки
• Восприятие проекта• Устойчивость ко взлому• Масштабируемость• Производительность• Стабильность• Гибкость• Скорость итерирования• Простота
13 / 63
![Page 14: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/14.jpg)
Препродакшен: время на вес золота
• Скорость итерирования• Гибкость• Простота• Восприятие проекта• Стабильность
• Производительность
• Масштабируемость
• Устойчивость ко взлому
14 / 63
![Page 15: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/15.jpg)
Фокус на скорость и лёгкость разработки
• Механизмы, а не решения.• Лучше быстро чем правильно.• Много коротких итераций.
15 / 63
![Page 16: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/16.jpg)
Лучше быстро чем правильно. Переориентацияперфекционизма
• Чем меньше кода тем лучше.• Плохой код лучше сложного.• Хаки в механизмах допустимы, хаки в решениях — нет.• Рефакторить нужно только то, что болит.
16 / 63
![Page 17: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/17.jpg)
Основные этапы разработки
• Выбор геймплея пилотного прототипа.• Выбор технологического стека.• Реализация минимального пилотного прототипа.• Итерирование с гейм-дизайнерами.
17 / 63
![Page 18: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/18.jpg)
Выбор геймплея пилотного прототипа: Задачи
• Максимально простой• но играбельный• повод реализовать все базовые игровые сущности и механизмыпрототипа.
18 / 63
![Page 19: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/19.jpg)
Геймплей первого прототипа
• Игрок, перемещаясь по карте, ищет расставленных на ней мобов;• найдя моба может попробовать его поймать с заданной вероятностьюуспеха;
• успешная поимка моба увеличивает счётчик в характеристиках игрока;• пойманный моб исчезает с карты;• через некоторое время моб респавнится в том же месте;• администраторы могут добавлять новых мобов на карту.
19 / 63
![Page 20: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/20.jpg)
Критерии выбора технологического стека
• Что-то знакомое, на чём можно написать быстро,• или что-то интересное и зажигающее.• Главное не забыть вовремя выбросить весь код.
20 / 63
![Page 21: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/21.jpg)
Технологический стек
• Сервер:• Redis,• OpenResty,• Docker.
• Клиент:• Одностраничное веб-приложение в браузере,• HTML5.
21 / 63
![Page 22: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/22.jpg)
Почему не что-то готовое?
Not Invented Here Syndrome?
И да и нет.
22 / 63
![Page 23: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/23.jpg)
Redis
• Надёжное, хорошо зарекомендовавшее себя решение.• Работа с координатами из коробки:
• GEOADD key longitude latitude member• GEORADIUS key longitude latitude radius m
• Достаточно удобный набор примитивов для хранения игровых объектов.• Хранимые процедуры на Lua.
23 / 63
![Page 24: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/24.jpg)
OpenResty
• Дистрибутив nginx с поддержкой Lua, Redis и многим другим из коробки.• Очень быстро работает, достаточно дружелюбен, хорошоподдерживается.
• Пригоден как для быстрого прототипирования, так и для продакшена.
24 / 63
![Page 25: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/25.jpg)
Docker
• Воспроизводимая кроссплатформенная среда для разработки.• Хорошо снимает боль по настройке окружения разработчика.• Окружение разработчика можно быстро превратить в прототипсерверного окружения.
• Требует обновления до достаточно свежей версии.
25 / 63
![Page 26: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/26.jpg)
Браузер, HTML5
• На начальном этапе сервер важнее.• Бои в augmented reality и прочие рюшечки делать не нужно, можнопредставлять в голове.
• На HTML5 можно быстро написать дёшевый и сердитый клиент.• Есть ограниченный (но достаточный) доступ к данным геолокации.
26 / 63
![Page 27: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/27.jpg)
Docker: как установить на Ubuntu
• В Ubuntu, традиционно, старая версия.• За wget | sh больно бьём по рукам.• docker и docker-machine устанавливаем из apt-репозитория докера.• docker-compose устанавливаем через pip install.• Про установку на других платформах читаем официальнуюдокументацию.
27 / 63
![Page 28: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/28.jpg)
Docker на машине разработчика
Клиент
localhost:8080
OpenResty
Redis
28 / 63
![Page 29: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/29.jpg)
docker-compose.yml для разработки: Redis
version: "2"services:redis:
image: redisvolumes:- ./redis:/data
command: redis-server --appendonly yesopenresty: <...>
29 / 63
![Page 30: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/30.jpg)
OpenResty: интересные места nginx.conf (в сокращении)
error_log logs/error.log notice;http {include resolvers.conf;lua_package_path "$prefix/lualib/?.lua;;";lua_code_cache off; # TODO: Enable on production!server {
listen 8080;include mime.types;default_type application/json;location / { index index.html; root static/; }location = /api/v1/ { content_by_lua_file 'api/index.lua'; }
}}
30 / 63
![Page 31: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/31.jpg)
OpenResty: Dockerfile
FROM openresty/openrestyCOPY bin/entrypoint.sh /usr/local/bin/openresty-entrypoint.shCOPY nginx/conf /usr/local/openresty/nginx/confCOPY nginx/lualib /usr/loca/openresty/nginx/lualibCOPY nginx/lua /usr/loca/openresty/nginx/luaCOPY nginx/static /usr/loca/openresty/nginx/staticENTRYPOINT /usr/local/bin/openresty-entrypoint.sh
31 / 63
![Page 32: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/32.jpg)
OpenResty: entrypoint.sh
#!/bin/shgrep nameserver /etc/resolv.conf \| awk '{print "resolver " $2 ";"}' \> /usr/local/openresty/nginx/conf/resolvers.conf
/usr/local/openresty/bin/openresty -g 'daemon off;' "$@"
32 / 63
![Page 33: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/33.jpg)
docker-compose.yml для разработки: OpenResty
<...>openresty:
build: .ports:- "8080:8080"
volumes:- ./nginx/lualib:/usr/local/openresty/nginx/lualib:ro- ./nginx/api:/usr/local/openresty/nginx/api:ro- ./nginx/static:/usr/local/openresty/nginx/static:ro
links:- redis
33 / 63
![Page 34: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/34.jpg)
Вызовы API
• Пользовательские вызовы:• / состояние игрового мира,• /go/:go-id/ состояние игрового объекта,• /go/:go-id/act/:action-id выполнение действия.
• Системные вызовы:• /register создание пользователя,• /reset сброс базы в исходное состояние,• /patch апгрейд базы до текущей версии.
• NB: Админку (бэкофис) не делаем, используем внутриигровые механикидля администрирования игрового мира.
34 / 63
![Page 35: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/35.jpg)
Игровой объект
• С точки зрения сервера игровой мир состоит из игровых объектов.• Игровой объект имеет численные характеристики и действия.• Игровые объекты могут иметь координаты.• Игровые объекты без координат должны принадлежать другимобъектам или быть их прототипами.
35 / 63
![Page 36: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/36.jpg)
Цепочка прототипов
• Игровой объект может иметь прототип.• Игровой объект — прототип в свою очередь также может иметьпрототип.
• Игровой объект наследует характеристики и действия своих прототипов.
36 / 63
![Page 37: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/37.jpg)
Характеристики
• Характеристика — именованное численное свойство игрового объекта.• Если у игрового объекта нет какой-то характеристики, её значениеберётся у ближайшего прототипа по цепочке (если не нашли — 0).
37 / 63
![Page 38: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/38.jpg)
Действия
• Действие на игровом объекте — идентификатор из таблицыобработчиков действий.
• Действие может быть инициировано игроком, если у него достаточно наэто прав.
38 / 63
![Page 39: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/39.jpg)
Моб: Зелёная Жаба{id = 'proto.mob.collectable';chrs = { respawn_dt = 10 * 60 };actions = { 'mob.collect' };
};{id = 'proto.mob.toad.green';proto_id = 'proto.mob.collectable';chrs = { escape_chance = 0.25 };
};{id = 'fa2eb7bca46c11e6be447831c1cebc82';proto_id = 'proto.mob.toad.green';geo = { lat = 55.7558, lon = 37.6173 };
};39 / 63
![Page 40: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/40.jpg)
Действие: поймать мобаACTIONS['mob.collect'] = function(target, initiator)if
math.random() * initiator.chrs.collect_skill >target.chrs.escape_chance
then-- Inc number of catches for this mob typego_inc_chr(initiator.id, target.proto_id, 1)go_schedule_action_initiation( -- Schedule respawntarget.chrs.respawn_dt, 'mob.spawn',{ proto_id = target.proto_id, pos = target.pos },initiator.id
)go_remove(target.id) -- Mob is caught, remove
endend
40 / 63
![Page 41: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/41.jpg)
Выполнение отложенных действий
local timestamp = os.time()local action_ids = redis:zrangebyscore('da', '-inf', timestamp)for i = 1, #action_ids do-- Execute action_ids[i] action
endredis:zremrangebyscore('da', '-inf', timestamp)
41 / 63
![Page 42: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/42.jpg)
Игрок
{id = 'proto.user';chrs = { vision = 100, reach = 50 };
};{id = 'user.1';geo = { lat = 55.7558, lon = 37.6173 };chrs = { collect_skill = 0.5 };
};
42 / 63
![Page 43: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/43.jpg)
Предмет: Админская шапка
{id = 'proto.item.wearable';actions = {
['item.don'] = { enabled = true };['item.doff'] = { enabled = false };
};}{id = 'proto.item.admin-hat';proto_id = 'proto.item.wearable';grants = { 'user.admin' };chrs = { collect_skill = 0.25 };
};
43 / 63
![Page 44: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/44.jpg)
Выдадим админскую шапку пользователю
local hat = go_new('proto.item.admin-hat')
assert(go_get('user.1').stored[1] == nil)
go_store('user.1', hat.id)
assert(go_get('user.1').stored[1] == hat.id)
44 / 63
![Page 45: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/45.jpg)
Хранение (”storage”)
• Игровой объект может ”хранить” другие объекты.• Хранимые объекты не ”видны” извне хранящего объекта.• Пользователю доступны действия непосредственно хранимых имобъектов.
• Характеристики хранимых объектов никак не влияют на характеристикихранящих их объектов.
45 / 63
![Page 46: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/46.jpg)
Действия на админской шапке
ACTIONS['item.don'] = function(target, initiator)go_unstore(initiator.id, target.id)go_attach(initiator.id, target.id)go_disable_action(target.id, 'item.don')go_enable_action(target.id, 'item.doff')
end
ACTIONS['item.doff'] = function(target, initiator)go_attach(initiator.id, target.id)go_store(initiator.id, target.id)go_disable_action(target.id, 'item.doff')go_enable_action(target.id, 'item.don')
end
46 / 63
![Page 47: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/47.jpg)
Прикрепление / надевание (”attachment”)
• К игровому объекту могут быть ”прикреплены” другие объекты.• Прикреплённые объекты видны извне родительского объекта.• Пользователю доступны действия прикреплённых непосредственно кнему объектов.
• Характеристики прикреплённых объектов прибавляются кхарактеристикам родительских объектов.
47 / 63
![Page 48: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/48.jpg)
Предмет: Спавнилка зелёных жаб
{id = 'proto.item.spawner.toad.green';actions = {
['mob.spawn'] = {requires = { 'user.admin' };param = { proto_id = 'proto.mob.toad.green' };
};};
};
48 / 63
![Page 49: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/49.jpg)
Права на действия
• Действие доступно для выполнения только если grants игрокасодержит все записи из requires действия.
• Прикреплённые к игроку (”надетые”) предметы добавляют ему своиgrants.
49 / 63
![Page 50: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/50.jpg)
Демонстрация
• Текущую версию приложения вы можете найти на geo.logiceditor.com.• Ссылка на репозиторий с кодом будет опубликована там же на этойнеделе, следите за анонсами в Twitter @agladysh.
• Самый первый клиент — всегда curl. API можно пощупать им, добавивк адресу приложения /api/v1.
50 / 63
![Page 51: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/51.jpg)
Как работает клиент?
• Инициализируются геолокация и гуглекарты.• Текущая позиция отправляется на сервер.• Сервер возвращает перечень видимых объектов с возможнымидействиями.
• Объекты помечаются маркерами на карте и выводятся под ней вёрсткой.• Ожидаем активации действия пользователем либо смены координат.
NB:• Для генерации имён жаб на основе их идентификаторов используетсяchance.js.
• Перерисовку лучше проводить по таймеру, вне зависимости от циклаобновления данных.
51 / 63
![Page 52: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/52.jpg)
Геолокация на HTML5
• navigator.geolocation.watchPosition(callback, options).• В Chrome пользуйтесь панелью разработчика Sensors для отладкигеолокации.
• В Chrome по соображением безопасности отключена геолокация дляпротокола HTTP (за исключением сайтов на localhost). ИспользуйтеHTTPS, например, с сертификатами от Let’s Encrypt.
52 / 63
![Page 53: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/53.jpg)
Google Maps
new google.maps.Map(assert(document.getElementById('map')), {center: new google.maps.LatLng(pos.lat, pos.lon),zoom: 18,mapTypeId: google.maps.MapTypeId.ROADMAP,disableDefaultUI: true,disableDoubleClickZoom: true,draggable: false,scrollwheel: false,styles: [ { featureType: "poi",
stylers: [ { visibility: "off" } ]} ]
});
53 / 63
![Page 54: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/54.jpg)
Проблемы проекта
• Шумные данные от GPS.• Крайне низкая точность геолокации в зданиях.• ...
54 / 63
![Page 55: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/55.jpg)
Проблемы Технические ограничения проекта
• Шумные данные от GPS.• Крайне низкая точность геолокации в зданиях.• ...
Нет проблем. Есть ограничения, под которые нужно подстраивать геймплей.Часть из них решается технологически. Нужно ли тратить время на эторешение — один из вопросов, на которые должен ответить этаппрепродакшена.
55 / 63
![Page 56: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/56.jpg)
Недостающие механизмы
• Самое крупное — система событий.• Много мелких функций, например счётчик пройденных метров.
56 / 63
![Page 57: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/57.jpg)
Ошибки
• Поздновато добавили геолокациию.• Поздновато добавили карту в клиенте.• Мало выходили на улицу чтобы тестировать.• ...• Найдите сами, сравнив код на слайдах с кодом в проекте.
57 / 63
![Page 58: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/58.jpg)
Итоги
• Относительно малыми усилиями• мы сделали крошечную мобильную игру с геолокацией• и заложили фундамент для быстрой разработки большого числанесложных прототипов
• для поиска удачных вариантов геймплея в этом жанре.
58 / 63
![Page 59: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/59.jpg)
Благодаря чему разработка быстрая?
• В проекте небольшой объём простого кода,• использующего базовые механизмы и надёжные сторонние решения• для решения большого числа поставленных геймдизайнером задач.
• Аккуратное расширение возможностей этого кода• ещё больше расширит круг задач, которые можно будет решить,• поменяв несколько строк в конфиге.
59 / 63
![Page 60: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/60.jpg)
Векторы развития проекта
• Новые варианты геймплея• Новые функции и механизмы• Решение технических проблем
60 / 63
![Page 61: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/61.jpg)
Как работать с гейм-дизайнером на ранних этапахпрототипирования?
• Быстро итерироваться. В идеале — садиться рядом, кодить и сразуполучать фидбек. Пробовать самому иногда делать рутинную частьработы гейм-дизайнера, чтобы лучше понять, что именно мешает итормозит процесс.
• В первую очередь исправлять мешающие тестировать геймплей баги,потом улучшать старые механизмы в коде и добавлять новые.
• Если для новой геймплейной фичи нет механизма, добавлять его, хотябы в самой грубой форме, а не реализовывать решение в лоб.
• Все прочие задуманные изменения в коде, в том числе рефакторинг,реализовывать в порядке убывания боли от их отсутствия.
61 / 63
![Page 62: Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Docker / Александр Гладыш (LogicEditor)](https://reader033.vdocuments.mx/reader033/viewer/2022052318/586f90ff1a28ab54768b7abf/html5/thumbnails/62.jpg)
Дорога к релизу
• Выбросить весь код и написать заново.• Создать новый проект и вдумчиво вручную перенести в него удачныечасти кода.
• Неудачные — переписать с нуля.
62 / 63