Тайловая 2D-игра с несколькими игроками — это не «тот же одиночный проект, но с сетью». Как только появляется второй клиент, у вас появляется источник правды: кто решает, можно ли пройти в клетку, подобрать предмет или открыть дверь. Ниже — приземлённая схема без привязки к конкретной библиотеке: логика остаётся полезной и для ENet, и для других транспортов.
1. Слои тайлов: что видит игрок и что «существует» в правилах
В Godot 4 удобно опираться на TileMapLayer: фон, коллизия, декор. Игроку приятно видеть воду, тени и мелкие детали, но для сетевой логики достаточно знать индекс тайла коллизии и навигационные флаги. Если визуальный тайл «кружок травы» рисуется поверх walkable-клетки — это нормально; если декоративный камень перекрывает проход — это уже баг дизайна уровня, который проявится одинаково у всех только если сервер и клиент используют одну и ту же карту коллизий.
2. Минимальная сетевая декомпозиция
Клиент собирает ввод (клавиатура, геймпад), может локально «предугадывать» движение для отзывчивости, но итоговое положение после подтверждения сервера — то, что должно совпасть у всех.
Сервер (часто отдельный headless-билд) хранит состояние комнаты: позиции, HP, инвентарь, открытые двери. Он же решает конфликты: два игрока нажали «подобрать» один предмет — выигрывает тот, чья команда пришла раньше по серверным тикам или по вашему правилу приоритета.
3. Что синхронизировать в первую очередь
- Идентичность уровня — один и тот же TileSet и те же layer id на всех клиентах (версионируйте ресурс: hash в handshake).
- Стартовые спавны — фиксированные точки или процедурно, но детерминированно от сида, известного серверу.
- Сущности — игроки и интерактив: стабильные
peer_id/entity_id, чтобы RPC не путали адресатов.
4. Психология кода: один модуль «правил»
Вынесите проверку «можно ли шагнуть из клетки A в B» в чистую функцию GDScript (или C#), которую вызывает только сервер для финального решения. Клиент может дублировать её для предсказания, но не должен считать её единственным законом. Так вы уменьшите расхождение поведения между «красивым локальным движением» и жёстким откатом при рассинхроне.
5. На что смотреть дальше
Когда базовая топология ясна, следующий шаг — выбрать модель симуляции (фиксированный тик против переменного кадра) и формат сообщений. Об этом — во второй части цикла про синхронизацию и снапшоты.
