Использование TileMaps (Тайловых Карт)

Введение

Карта тайлов - это сетка тайлов, используемая для создания макета игры. Есть несколько преимуществ использования узлов TileMap для разработки ваших уровней. Во-первых, они позволяют рисовать макет путем «рисования» плиток на сетке, что намного быстрее, чем размещение отдельных узлов Sprite один за другим. Во-вторых, они позволяют использовать гораздо большие уровни, поскольку оптимизированы для рисования большого количества плиток. Наконец, вы можете добавлять к плиткам формы столкновения, окклюзии и навигации, добавляя дополнительные функциональные возможности TileMap.

../../_images/tileset_draw_atlas.png

Настройка проекта

В этой демонстрации мы будем использовать следующие плитки, взятые из набора рисунков Кенни «Абстрактный платформер». Вы можете найти полный набор здесь, но для этой демонстрации мы будем придерживаться этого небольшого набора.

../../_images/tilesheet.png

Создайте новый проект и поместите изображение выше в папку проекта.

При использовании набора плиток важно, чтобы соседние плитки совпадали. По умолчанию Godot импортирует 2D-изображения с использованием режима интерполированного «фильтра», что приводит к некрасивым границам между плитками. Выберите изображение и щелкните вкладку Импорт. Отключите Filter и нажмите «Реимпорт». Смотрите Импорт изображений для подробностей.

Узел TileMap

Добавьте в сцену новый узел TileMap. По умолчанию TileMap использует квадратную сетку плиток. Вы также можете использовать основанный на перспективе «Изометрический» режим или определить свою собственную форму плитки.

../../_images/tilemap_mode.png

В разделе «Cell» в Инспекторе есть множество параметров, которые вы можете регулировать для настройки поведения тайловой карты:

../../_images/tilemap_size.png
  • Size

    Это определяет размер сетки. Должно соответствовать размеру ваших плиток в пикселях. Значение по умолчанию - (64, 64).

  • Y Sort

    Это приводит к отрисовке тайлов в порядке их положения Y , так что «нижние» тайлы отрисовываются поверх «более высоких».

  • Half Offset и Tile Origin

    Эти свойства влияют на положение плитки относительно положения сетки.

  • Quadrant

    Определяет размер блока, используемого для пакетного рисования. Это может отрицательно сказаться на производительности. Не меняйте его, если вы не знаете, что делаете.

  • Custom Transform

    Используется для изменения формы плитки. Используйте это, если у вас не квадратная плитка.

Все эти настройки могут быть оставлены в их значениях по-умолчанию для этой демонстрации.

Создание набора тайлов

После того, как вы настроили TileMap, пора добавить TileSet. TileSet - это ресурс, который содержит данные о ваших плитках - их текстурах, формах столкновения и других свойствах. Когда игра запускается, TileMap объединяет отдельные плитки в один объект.

Чтобы добавить новый TileSet, нажмите на свойство "Tile Set" и выберите "Новый TileSet".

../../_images/tilemap_add_tileset.png

Щёлкните свойство TileSet, и в нижней части окна редактора откроется панель «TileSet»:

../../_images/tilemap_tool.png

Во-первых, вам нужно добавить текстурy(-ы), которую(-ые) вы будете использовать для плиток. Нажмите кнопку «Добавить текстуру(-ы) в Набор плиток» и выберите изображение tilesheet.png.

Затем нажмите «New Single Tile» (Новая одиночная плитка) и выделите часть изображения, которую вы хотите сделать отдельной плиткой. Нажмите кнопку «Enable Snap» (Включить привязку), чтобы упростить выделение плитки. Вокруг выбранной плитки появится жёлтый прямоугольник.

../../_images/tilemap_add_tile.png

Щёлкните TileMap в дереве сцены, и вы увидите, что вновь созданная плитка теперь появляется с правой стороны. Щёлкните в области просмотра, и вы сможете размещать плитки. Щёлкните правой кнопкой мыши, чтобы удалить их.

../../_images/tilemap_draw.png

Легко случайно выбрать и переместить узел тайловой карты. Чтобы этого избежать, используйте кнопку блокировки узла:

../../_images/tile_lock.png

Виды и формы коллизий (столкновений)

Если вы создаёте карту, для которой требуются столкновения - стены, пол или другие препятствия - вам необходимо добавить формы столкновения к любым плиткам, которые вы хотите считать «твёрдыми».

Нажмите "TileSet" в нижней части окна редактора, чтобы вернуться к инструменту для работы с набором плиток. Щёлкните ранее определённую плитку (обведена жёлтым). Выберите вкладку «Collision» и нажмите кнопку «Create a new rectangle». Убедитесь, что привязка к сетке всё ещё включена, затем щёлкните плитку и перетащите её. Квадратная форма столкновения отображается голубым цветом:

../../_images/tileset_add_collision.png

Таким же образом можно добавить к плитке формы перекрытия и навигации.

Атлас плиток

Вместо того, чтобы добавлять отдельные плитки по одной, вы можете определить группу плиток сразу, используя атлас. Это также позволяет случайным образом генерировать плитки из группы.

Нажмите «New Atlas» и выделите весь лист с плитками.

../../_images/tileset_atlas.png

Если вы ещё этого не сделали, не забудьте изменить «Шаг» в настройках привязки на (64, 64), иначе ваши плитки могут быть разрезаны на более мелкие части. Вы можете найти это в Инспекторе:

../../_images/tileset_snap.png

После того, как вы определили атлас, вы можете добавить формы столкновения к отдельным плиткам, как раньше. Также вы можете щёлкнуть «Icon», чтобы выбрать одну из плиток, представляющих атлас.

Вернувшись в TileMap, вы можете выбрать атласа плиток, и увидите все плитки, которые он содержит:

../../_images/tileset_draw_atlas.png

Помимо экономии времени при определении плиток, это может помочь группировать похожие плитки вместе, когда вы работаете с большим количеством плиток.

Случайные приоритеты плитки

При рисовании плитками из атласа включение опции «Use priority» приводит к случайному выбору плиток. По умолчанию каждая плитка в наборе имеет равную вероятность появления. Вы можете изменить это, установив разные приоритеты для каждой плитки. Например, плитка с приоритетом 2 будет выбираться в два раза чаще, чем плитка с приоритетом 1, а плитка с приоритетом 3 будет выбираться на 50% чаще, чем плитка с приоритетом 2.

Автотайлы

Автотайлы позволяют определять группу плиток, а затем добавлять правила для управления тем, какая плитка будет использоваться для рисования, на основе содержимого соседних ячеек.

Нажмите «Новый автотайл» и перетащите, чтобы выбрать тайлы, которые вы хотите использовать. Вы можете добавлять столкновения, перекрытие, формы навигации, приоритеты тайла и выбирать тайл значка таким же образом, как и для тайлов атласа.

Выбор плитки контролируется битовыми масками. Битовые маски можно добавить, нажав «Bitmask», а затем щёлкнув по части плитки, добавляя или удаляя биты в маске. Щелчок левой кнопкой мыши по области плитки добавляет бит, щелчок правой кнопкой удаляет его, а щелчок левой кнопкой мыши с удерживанием Shift устанавливает бит «игнорирования».

Всякий раз, когда Godot обновляет ячейку с помощью автотайла, он сначала создаёт шаблон, на основе которого уже установлены соседние ячейки. Затем он ищет в автотайле одиночный тайл с битовой маской, соответствующей созданному шаблону. Если совпадающая битовая маска не найдена, вместо неё будет использоваться плитка, назначенная в качестве иконки. Если найдено несколько совпадающих битовых масок, одна из них будет выбрана случайным образом с использованием приоритетов тайлов.

Правила сопоставления битовой маски с шаблоном зависят от параметра "Autotile Bitmask Mode". Его можно установить на вкладке «Inspector» под заголовком «Selected Tile». Допустимые значения: «2x2», «3x3 (minimal)» и «3x3».

Для соответствия битовой маски все биты «вкл» и «выкл» должны быть удовлетворены, но биты «игнорирования» игнорируются.

2x2

В режиме 2x2 каждая битовая маска содержит четыре бита, по одному для каждого угла.

Если бит включён, все ячейки, связанные с этим углом, должны быть заполнены с использованием одного и того же автотайла, чтобы битовая маска соответствовала. Например, если установлен верхний левый бит, ячейка непосредственно над, слева и по диагонали над левым уголком должна быть заполнена.

Если бит выключен, по крайней мере одна ячейка, связанная с этим углом, не должна быть установлена с использованием одного и того же автотайла.

По крайней мере, один бит должен быть установлен для плитки, которая будет использоваться, поэтому всего потребуется 15 плиток, чтобы обеспечить ровно одну плитку для каждого расположения, которое этот режим может проверить.

Режим 2x2 может соответствовать только ячейкам, которые являются частью блока 2 на 2 - ячейки без соседей и линии шириной только в одну ячейку не поддерживаются.

Шаблон - Общий:

Этот шаблон можно использовать для перспектив сбоку или полностью сверху вниз. Он разработан для размера ячейки TileMap 64x64.

Ключ:

  • Красный: "включен"

  • Белый: "выключено"

../../_images/autotile_template_2x2.png

3x3(minimal)

В режиме 3x3 (minimal) каждая битовая маска содержит 9 бит (4 угла, 4 ребра, 1 центр). 4 угловых бита работают так же, как и в режиме 2x2.

Когда бит ребра «включён», ячейка, которая примыкает к этому ребру, должна быть заполнена. Когда бит ребра выключен, ячейка, примыкающая к этому ребру, должна быть пустой.

Центральный бит должен быть включён для любой плитки, которую вы хотите использовать. Обратите внимание, что в этом режиме нет смысла включать угловой бит, если какой-либо смежный с ним бит ребра не включён.

Всего потребуется 47 плиток, чтобы обеспечить ровно одну битовую маску для каждой компоновки, которую можно проверить в этом режиме.

Примечание

Щёлкните по изображению правой кнопкой мыши и выберите Сохранить изображение как…, чтобы сохранить его.

Шаблон - Общий:

Этот шаблон можно использовать для перспектив сбоку или полностью сверху вниз. Все приведенные ниже шаблоны предназначены для ячеек TileMap размером 64x64, но вам, возможно, придется использовать разные размеры субтайлов для нисходящих шаблонов, как описано ниже.

Ключ:

  • Красный: "включен"

  • Белый: "выключено"

../../_images/autotile_template_3x3_minimal.png

Шаблон - Общие 16 тайлов(клеток):

Этот шаблон может быть использован для набора тайлов, которые имеют только 16 плиток, он может применяться для простых художественных стилей, отсутствующие плитки видны не будут.

Ключ:

  • Красный: "включен"

  • Белый: "выключено"

  • В синюю клетку: "игнорировать"

../../_images/autotile_template_3x3_minimal_16.png

Шаблон - Сверху вниз в перспективе 3/4:

Ключ (относится к четырем шаблонам ниже):

  • Зеленый: пол

  • Голубой: стена

  • Желтый: верх стены

  • Серый: скрыт из-за перекрытия

  • Прозрачный: воздух

../../_images/autotile_template_3x3_minimal_topdown_floor.png

Шаблон - стена сверху вниз в перспективе 3/4:

../../_images/autotile_template_3x3_minimal_topdown_walls.png

Шаблон - стена сверху вниз в перспективе 3/4 (толстые стены):

При использовании этого шаблона установите размер подтайтла набора тайлов на Vector2 (64, 88).

../../_images/autotile_template_3x3_minimal_topdown_walls_thick.png

Шаблон - Сверху вниз в перспективе 3/ 4 (высокие стены):

При использовании этого шаблона установите для шага «Параметры привязки» значение Vector2 (64, 184) и смещение текстуры «Выбранная плитка» на высоту минус размер ячейки. Это означает, что смещение текстуры должно быть ``Vector2 (0, -120) ``:

../../_images/autotile_template_3x3_minimal_topdown_walls_tall.png

3x3

В режиме 3x3 каждая битовая маска содержит 9 бит (4 угла, 4 края, 1 центр)

Каждый бит проверяет одну соседнюю ячейку. Угловые биты проверяют только диагонально соседние ячейки. Центральный бит должен быть включен для любой плитки, которую вы хотите использовать.

Всего потребуется 256 плиток, чтобы обеспечить ровно одну битовую маску для каждой компоновки, которую этот режим может проверить.

Отключение карт тайлов

При использовании автотайла можно отключить его поведение и выбрать плитки вручную, щелкнув «Отключить автотайл» в верхней части окна выбора плитки.

Привязка автотайла

По умолчанию автотайл проверяет только соседние ячейки, заполненные одним и тем же автотайлом. Это поведение можно переопределить, чтобы автотайлы связывались друг с другом или даже с пустыми ячейками. В настоящее время это можно сделать только с помощью сценариев. Вам нужно будет добавить сценарий в свой набор тайлов и определить функцию с именем «_is_tile_bound (drawn_id, neighbour_id)». Эта функция будет вызываться для каждой соседней ячейки, которая не содержит такой же автотайл, и должна возвращать истину, если вы хотите, чтобы нарисованная ячейка «привязывалась» к соседней ячейке. Вы можете найти идентификатор автотайла, используя «find_tile_by_name (name)», пустым ячейкам присваивается идентификатор -1.

Обратите внимание, что для использования этого в редакторе сценарий должен начинаться с объявления «tool», и вам может потребоваться закрыть и перезагрузить сцену, чтобы эти изменения вступили в силу.

Советы и хитрости

  • Если вы используете: ref: Camera2D <class_Camera2D> для прокрутки уровня, вы можете заметить линии, появляющиеся между вашими плитками(тайлами). Чтобы исправить это, откройте настройки проекта и включите «Использовать пиксельную привязку» в разделе «Рендеринг/Качество».

  • Вы можете переворачивать и вращать плитки, используя значки в правом верхнем углу редактора.

  • Чтобы рисовать прямые линии, удерживайте: kbd: Shift, щелкая и перетаскивая плитку.

  • Такие инструменты, как копирование, вставка и заливка ведром, можно найти в меню «Карта тайлов» в правом верхнем углу.

../../_images/tilemap_menu.png