Как лучше реализовать обновление координат игроков в игре?
Здравствуйте, коллеги! Недавно размышлял на тему создания примитивной 2d браузерной игры.
Непонятен один момент. Каждый клиент (компьютер игрока, в нашем случае) опрашивает сервер несколько раз в секунду (знаю, что сокеты лучше, но я хочу пока так сделать), и сервер отдает JSON с координатами всех игроков (их всего 2). После чего клиент получает JSON и обновляет позиции игроков. Непонятно где храниться json-файл. Просто в файле на сервере? Но в таком случае будут проблемы с одновременной записью в файл + проблемы с получением блокировки, короче говоря файл - не выход. Вообщем мне не понятна система с получением и обновлением координат игроков. Как это реализовать?
Заранее выражаю огромную благодарность всем, кто поможет.
Просто в файле на сервере? Но в таком случае будут проблемы
Никаких проблем не будет и быть не может. Просто это не рационально для большого количества игроков и часто меняющихся данных, особенно для запросов.
И не забывайте про экстраполирование координат у клиентов!
p.s. только файлика должно быть два.
А базы данных для чего придумали?
Создаёте сущность (таблицу) в бд с игроками. При смене позиции игрока шлете запрос на сохранение новой позиции для конкретного игрока. Для получения позиции всех (нужных вам) игроков делаете выборку из базы и возвращаете уже в нужном вам формате (json).
Если скорость ответа базы имеет значение смотрите в сторону Nosql - redis, mongodb.
Если это игра в реальном времени, то делается отдельный "рабочий" демон, который обсчитывает логику матча и хранит всё прямо у себя в памяти. Игроки взаимодействуют с ним напрямую (обычно устанавливается постоянное соединение, но можно и по http опрашивать для начала). После завершения матчка изменённые данные скидываются в базу.
Если игра пошаговая, то либо в базу либо в кеш, но в обоих случаях надо сразу брать в расчёт максимальную ожидаемую нагрузку на них (сколько одноврмеенных запросов будет, сколько данных будет гоняться, как часто будут они обновляться). Это всё очень специфично для конкретного проекта.