Когда карта тайловая, «состояние мира» обычно компактно: сетка известна, меняются акторы и динамические объекты. Это упрощает сетевой трафик по сравнению с полностью процедурным 3D, но не отменяет дисциплины.
1. Тик симуляции
Фиксированный тик (например 20 или 30 Гц логики) упрощает повторяемость: сервер обрабатывает очередь команд, обновляет позиции, рассылает результат. Клиент может интерполировать отображение между тиками, но не путайте визуальное сглаживание с тем, что «разрешено» логикой.
2. Команды вместо «абсолютных координат»
Игрок редко должен посылать «я в (x,y)». Лучше: намерение — «шаг на север», «использовать объект id N». Сервер проверяет по своей сетке и либо подтверждает, либо отклоняет с кодом причины. Так вы резко снижаете класс читов с телепортацией.
3. Снапшот и дельта
Новому участнику после загрузки сцены отправьте снапшот: seed уровня, состояние дверей, позиции сущностей, таймеры. В процессе сессии чаще достаточно дельт — изменившиеся поля за тик. Если игра долгая, планируйте редкий полный снапшот для самовосстановления после ошибок.
4. Пример структуры сообщения (идея, не готовый плагин)
# Условный формат — подставьте свои MultiplayerAPI вызовы
# tick: int
# entities: Array[{ id, cell_x, cell_y, vel, state_flags }]
func _apply_tick_state(snapshot: Dictionary) -> void:
for e in snapshot.get("entities", []):
_entity_nodes[e.id].apply_network_state(e)
Храните сериализацию короткой: для тайловой сетки часто достаточно целочисленных координат клетки, а не float мировых координат.
5. Задержка и честность
Если жанр допускает, добавьте небольшую коррекцию отката при несовпадении: плавно сдвинуть спрайт к согласованной клетке. Игроки воспринимают это лучше, чем «дёргание», если визуальный стиль не требует пиксель-идеальной точности в каждом кадре.
