Перейти к основному содержанию
RobustToolbox имеет встроенную поддержку тайловых карт, называемых сетками (игроки SS14 также могут называть их шаттлами или станциями). Внутренне они хранятся в виде чанков, так что при обновлении тайла обновляется только этот конкретный чанк, а не вся сетка. Чанки хранятся в хеш-карте по их началу (нижний левый угол). Это означает, что при расширении сетки нам не нужно копировать огромный массив, а нужно только создать или удалить новый чанк по мере необходимости.

Коллизия сеток

Сетки используют тот же физический код (box2d), что и всё остальное. Сначала стоит ознакомиться с документацией box2d. Мы генерируем фикстуры для каждого чанка и прикрепляем их к телу сетки. При обновлении тайла мы регенерируем все фикстуры для этого чанка; мы также стараемся генерировать фикстуры максимально большого размера, чтобы уменьшить их общее количество. Например, если все тайлы чанка 16x16 заполнены, то будет 1 фикстура размером 16x16. В SS14 это выглядит следующим образом: grids.jpg *Красные линии представляют границы фикстур. Карта SS14 может состоять из сотен фикстур. *В нижнем левом углу виден шов между соседними чанками. Фикстуры генерируются на уровне чанков, поэтому не будут больше.

Разделение сеток

Когда тайлы отделяются от остальной части сетки, мы определяем, нужно ли выделить их в новую сетку. Для этого требуется поиск пути при каждом обновлении фикстур сетки, чтобы определить, не отделились ли какие-либо части. Вместо выполнения этой операции для каждого тайла (что было бы prohibitively дорого), мы превращаем группы тайлов в одном чанке в “узлы” и выполняем поиск пути по ним. Весь процесс выглядит следующим образом:
  1. Когда чанку необходимо регенерировать фикстуры, мы также регенерируем его узлы. Мы делаем это, выполняя floodfill каждого тайла в чанке и возвращая каждый отдельный узел.
  2. Для каждого узла мы определяем его соседей. Они не могут находиться в том же чанке (иначе они были бы частью исходного floodfill), поэтому мы проверяем только тайлы в соседних чанках на наличие их узлов.
  3. На этом этапе мы построили граф сетки. На предыдущих шагах мы отметили, какие узлы были “грязными” (новые созданные и все соседние). Отсюда мы начинаем floodfill грязных узлов, чтобы определить, все ли они соединены друг с другом. Если все грязные узлы всё ещё соединены, разделение невозможно; но если после floodfill остались узлы, мы продолжаем итеративно, пока не получим все отдельные группы узлов.
  4. Из полученных групп узлов мы создаём новые сетки. Для этого мы:
  • Создаём новую сетку и применяем позицию + физические данные старой сетки (например, её скорость)
  • Устанавливаем все тайлы на новой сетке
  • Для каждого тайла проверяем наличие закреплённых сущностей и перезакрепляем их на новой сетке. Поскольку новая сетка имеет ту же позицию и поворот, что и старый родитель, нам нужно только обновить родителя.
  • Для каждого тайла проверяем наличие незакреплённых сущностей и переназначаем их родителя на новую сетку.
  • Устанавливаем все тайлы на старой сетке как пустые.

Отладка

Команды

showchunkbb Включает отображение всех фикстур сеток в окне просмотра. showgridnodes Включает отображение узлов сеток, используемых для проверки разделения. Также включает связи между узлами.
Последнее изменение 21 июня 2026 г.