Как делать дорожки из плитки


Как сделать дорожку на даче своими руками из плитки: инструкции, фото пошагово

Как сделать дорожку на даче из тротуарной плитки – непростой вопрос, однако, реализовать такую идею можно своими руками. Для этого потребуется изучить пошаговую инструкцию. Привлекательность такого метода обусловлена небольшой стоимостью материала. В этой статье мы расскажем о том, как подобрать и уложить плитку правильно.

Какую плитку выбрать?

Пешеходные дорожки являются важными объектами на даче, обеспечивающими свободное передвижение в пределах участка. Для их организации чаще всего используется тротуарная плитка. Данный материал имеет ряд важных достоинств, таких как:

  • экологичность,
  • надежность;
  • долговечность.

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

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

Разнообразие дорожек из плитки

Как подобрать плитку? При выборе этого строительного материала необходимо обратить внимание на назначение будущей дорожки. Если данная зона будет исключительно пешеходной, то для ее строительства можно использовать изделия, толщина которых составляет 40 мм. Из более объемной плитки можно выкладывать дорожки для проезда автотранспорта.

Также нужно обратить внимание на форму плитки. От этого фактора зависит сложность ее укладки. Изделия прямоугольной формы являются наиболее целесообразными, так как из них проще всего выполнить дорожку.

Материалы для садовой дорожки

Для того чтобы выложить красивую садовую дорожку, необходимо:

  • правильно подобрать материалы и запастись соответствующим инструментарием.
  • Чтобы сделать пешеходную тропинку, необходимо приобрести плиту с габаритами 50 на 50 см. Изделия таких размеров очень просто формируют дорожку.
  • Для укладки 1 квадратного метра потребуется всего 4 плитки.

Дорожка, выложенная из большой плитки, проще поддается уходу и ремонту, что также является серьезным преимуществом. Для укладки плитки понадобится подготовить песок. Стоит знать, что он не должен иметь никаких вредных примесей (щебня, глины и т. п.).

Также следует позаботится о разметке.

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

Обратите внимание! Кроме всего прочего, стоит запастись досками, которые будут выполнять функцию направляющих. А еще требуется подготовить большую прямую доску, которая будет использоваться для выравнивания песчаной поверхности.

Интересно: Как приготовить бетон: пропорции

Основание для дорожки

Чтобы дорожка не проседала в грунт, необходимо подготовить подложку под тротуарную плитку. Этот подготовительный этап ни в коем случае нельзя игнорировать. Закладка основания выполняется в несколько этапов. Первое, что потребуется сделать – выкопать небольшую яму. Необходимо снять приблизительно 20 сантиметров с грунта. Для этой цели как нельзя лучше подойдет штыковая лопата.

Следующий этап – установка деревянных досок, которые будут выполнять функцию направляющих. Своими руками сделать подложку сможет каждый. В этом нет ничего сложного. Песок засыпается в углубление, после чего с помощью прямой доски распределяется равномерно по поверхности.

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

Послойный пирог для укладки тратуарной плитки

Если тропинка будет располагаться вплотную к жилой постройке, то тогда нужно продумать отвод дождевых вод. Проще всего реализовать его с помощью наклона дорожки (от дома). Толщина песчаного слоя должна быть не менее 15 см.

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

Технология укладки плитки

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

Изделие располагается в необходимой зоне и простукивается резиновой киянкой. Это позволяет «утопить» отдельный элемент в песке. Масса киянки составляет примерно 1,5 кг. Далее, стоит воспользоваться шпателем, чтобы выровнять плитку. По мере необходимости разрешается добавлять или, наоборот, убирать песок.

Обратите внимание! Плитка, которая имеет сколы, также может быть использована в строительстве тропинки. Но швы между такими изделиями должны быть минимальными (не более 7 мм). Если соблюсти данное правило, то тогда дорожка будет выглядеть вполне эстетично.

Во время укладки рекомендуется использовать строительный уровень. Он позволит уложить плитку ровно. После завершения работы можно приступить к монтажу бордюров.

Интересно: Декоративные заборы для клумб

Установка бордюра

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

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

Дистанция между крайней линией дорожки и бордюром не должна быть слишком большой. Идеальным считается расстояние, равное 5-7 мм. Данная щель заполняется песком. Материал необходимо тщательно утрамбовать. Таким образом, производится установка бордюрного камня.

Как заделать швы между плитками?

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

Важно! Использование влажного материала недопустимо. Если вы обнаружили, что материал слегка влажный, то сначала дождитесь пока он высохнет и только после этого приступайте к заделке швов.

Для втирания песка используют специальные щетки, которые имеют жесткий ворс. Песок, оставшийся после затирки, нужно просто смести с тропинки. Для того чтобы материл плотнее лег в межплиточные швы, можно полить дорожку водой из садового шланга.

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

[totalpoll id=»2056″]

Напишите в комментариях:

А какими советами по укладке тротуарной плитки на даче можете поделиться вы?

Animal Crossing: New Horizons - с помощью этого простого трюка вы можете «обернуть» дорожки нестандартным дизайном

Есть лучший способ создавать действительно гибкие пути с помощью всего одной настраиваемой плитки.

В Animal Crossing: New Horizons пользовательских путей - обычное дело. Конструкции путей, которые Том Нук предлагает через приложение, являются дорогими и ограничительными, требуют много миль для покупки и выглядят довольно мягко.Поскольку вы можете разместить любую нестандартную конструкцию прямо на полу, создание плитки для использования в качестве дорожек предлагает решение. Однако один Redditor обнаружил, что есть лучший способ создавать действительно гибкие пути с помощью всего одной настраиваемой плитки.

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

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

СВЯЗАННЫЙ: Animal Crossing: New Horizons - Как использовать Nookazon для покупки любого предмета, который вы хотите

Помимо проблемы с пространством, есть еще время, необходимое для разработки плитки пути с различными параметрами.Это большая работа, которая, по-видимому, не нужна, поскольку кажется, что в игре есть встроенный обходной путь, отмеченный в этом посте на Reddit от Mimilegend.

Redditors быстро заметили, что путь не только очень хорошо проложен, но и изогнут на изображениях.Причина стала ясна, когда Мими прокомментировала, что дизайн «включает один прозрачный пиксель, чтобы« обернуть »темную грязь, чтобы сделать форму сердца (что мне нужно для этого)»

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

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

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

NEXT: Dataminer обнаруживает, как именно получить рейтинг острова 5 звезд в Animal Crossing: New Horizons

Game Pass Feature

Game Pass для ПК удваивается в цене со следующей недели

Об авторе Хелен Эшкрофт (Опубликовано 699 статей)

Хелен начала играть в игры в раннем возрасте, ее первым компьютером был подручный Sinclair ZX Spectrum.Это ее не оттолкнуло… Сейчас она уже выросла, но в душе все еще геймер, особенно когда речь идет о The Sims и других стратегиях и симуляторах. Она жонглирует повседневными жизненными требованиями с семьей и каким-то образом все еще находит время, чтобы потворствовать своим двум жизненным страстям: писательству и играм; иногда и то и другое одновременно.

Ещё от Helen Ashcroft .

лучших пользовательских шаблонов дизайна для дорожек, полов и земли | ACNH


С разрешения этих креативных дизайнеров мы представляем вам нашу лучшую коллекцию нестандартных дизайнов, которые вы можете использовать на земле для создания дорожек и полов в Animal Crossing: New Horizons (ACNH). Сохраняйте и делитесь дизайнами с помощью Design & User ID, а также не стесняйтесь делиться своими работами с нами!

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


Разместите свои баскетбольные кольца и мяч вокруг этой баскетбольной площадки в стиле Nintendo Switch, разработанной пользователем Reddit haha6m.

Корт будет занимать 3 x 6 мест, но займет только 12 дизайнерских слотов! Мы рекомендуем вместо этого поискать их Creator ID!

Создатель: haha6m (Reddit)
ID создателя: MA-6643-4903-3362
Баскетбольная площадка 5
Код проекта: MO-BK4H-H58V-FTB1
Баскетбольная площадка 6
Код проекта: MO-F5VR-NCMQ-BR65
Баскетбольная площадка 7
Код проекта: MO-JVCB-JF8N-3J4P
Баскетбольная площадка 8
Код проекта: MO-2JF0-247H-4375


Добавьте очарования своим игровым площадкам, разместив эти милые детские рисунки мелом, созданные пользователем Reddit odd_walrus!

Создатель: odd_walrus (Reddit)
Идентификатор создателя: MA-5349-8240-4196
Мел 1
Артикул: MO-SM0R-1G9D-YC6V
Мел 2
Обозначение дизайна: MO-LFB3-GVQL-JNYT


Создайте свой собственный японский сад камней, используя эти узоры дзенского сада из песка.У него прозрачный фон, который идеально подходит для размещения поверх песчаной дорожки. Это создано пользователем Twitter Pixebo. Вы также можете посетить их страницу в Instagram (@Pixebo), чтобы увидеть их личное искусство!


Эти цветочные узоры от пользователя Twitter islander_illtsu самые милые! Вы можете украсить свой остров, добавив эти узоры подсолнечника и клевера!

Существует 3 варианта для каждого типа цветка, поэтому мы рекомендуем получить их все, выполнив поиск по их Creator ID !

Создатель: islander_illtsu (Twitter)
Идентификатор создателя: MA-4471-1720-0257
Желтые цветы
Код дизайна: MO-Wh2C-WY30-TBRB
Белые цветы
Код дизайна: MO-6K2F-QX06-T8R6
Розовые цветы
Код дизайна: MO-CDW7-YQCW-1YHF
Клевер и цветок
Код дизайна: MO-BPQT-MGPD-6615


Используйте эти изящные рисунки от пользователя Reddit Unabanzie, чтобы отметить деревья вокруг вашего острова!


Вы можете воссоздать стеклянную плитку с этими рисунками, созданными marimo_angela.Вы можете выполнить поиск по их Creator ID , чтобы увидеть больше их работ!

Набор фишек, созданный negi_ebiten (Twitter), который можно разместить вокруг площади, чтобы она выглядела увеличенной.

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

Создатель: domori_kumanu (Twitter)
ID создателя: MA-0121-1937-3365
Цветочная плитка
Код дизайна: MO-K5LB-MHFK-6VXY
Цветочная дорожка
Артикул: MO-1FPJ-BSX0-RB5G

Создайте венецианский образ с этими узорами, вымощенными булыжником.У создателя также есть учебник на Youtube, если вы не против посмотреть на японском языке, «Простые методы аккуратного размещения нестандартных дизайнов на земле».

Создатель: kwgrnch (Twitter)
Идентификатор создателя: MA-5045-7448-4706
Розовый венецианский булыжник
Код дизайна: MO-7QC3-JHGF-HHCT
Синий венецианский булыжник
Артикул: MO-5RNC-N0PR-LB8Q
Черный венецианский булыжник
Код дизайна: MO-L435-XNVR-L9QL
Венецианский булыжник
Код дизайна: MO-YR86-M9SQ-QSY7

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

Создатель: atsumori_yuko (Twitter)
Идентификатор создателя: MA-1662-0923-2366
Столешница из разноцветного камня
Код дизайна: MO-SHCC-J29Q-38T9
Нижняя часть разноцветного камня
Код дизайна: MO-0KJ1-2XYN-RVB4
Разноцветный каменный тротуар слева
Код дизайна: MO-XRTL-KLFT-54F7
Цветное каменное покрытие справа
Код дизайна: MO-PXPL-GKLM-YJ3V

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

Создатель: Myonmyon344 (Twitter)
Идентификатор создателя: MA-8946-8051-7259
Shell Tile
Код проекта: MO-982Q-BMGQ-CLLY

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

Создатель: yrg1_mori (Twitter)
Идентификатор создателя: MA-2061-1680-8808
Камень
Обозначение проекта: MO-P0QL-NQXP-QCYP
Лестница, вымощенная белым камнем
Код проекта: MO-N5SD-7WL7-MMCK
Брусчатка из белого камня
Код дизайна: MO-SFHS-1MM3-V5D2


Наслаждайтесь звездными ночами, используя эти лунные и звездные дорожки, созданные пользователем Twitter julesjellyfish.Украсьте своими поделками Star DIY, чтобы создать зону желаний!

Создатель: julesjellyfish (Twitter)
Идентификатор создателя: MA-2110-8837-1812
Путь 1
Идентификационный номер проекта: MO-Fh34-T0NK-5HTQ
Путь 2
Идентификационный номер проекта: MO-WBFR-0XWP-B6TB
Сторона пути 1
Идентификационный номер проекта: MO-HXTV-0KHR-VWHP
Сторона тракта 2
Идентификационный номер проекта: MO-V3KP-6T0N-1XKM


Получите удовольствие от этих прекрасных бордюров, которые доступны во всех направлениях, супер хорошая работа! Посетите страницу пользователя Арии в Tumblr, чтобы увидеть больше об их острове и дизайне!

В этом наборе более 15 дизайнов, поэтому мы рекомендуем искать, используя их Creator ID !


Этот дизайн идеально сочетается с камнями у основания дзен-забора.Простой, но элегантный дизайн от пользователя Twitter @ atrem4!

В этом наборе 12 дизайнов, поэтому мы рекомендуем искать, используя их Creator ID !

Создатель: @ atrem4 (Twitter)
Идентификатор создателя: MA-7846-7909-0372
Zen-UL
Обозначение дизайна:
MO-WWGK-S4WD-TD16
Zen-UR
Обозначение дизайна:
MO-XF16-B5TB-0HJR
Zen-DL
Обозначение дизайна:
MO-LY8T-RXVD-LL9B
Zen-DR
Обозначение дизайна:
MO-LFYR-Mh3P-NPLW


Созданный пользователем Twitter marimo_angela, этот кружевной бордюр совместим с другими дизайнами путей, которые вы размещаете на своем острове!

Создатель: marimo_angela (Twitter)
Идентификатор создателя: MA-0885-0938-8047
Левая шнуровка
Код дизайна: MO-S421-2KK9-XR7R
Правое кружево
Обозначение дизайна: MO-GPX1-47B9-BX2D


Это первая граница пути, созданная пользователем Twitter mellissenpai, которая идеально сочетается с плиткой терракота!

Имеется более 60 узоров для этой рамки, в том числе закругленные, и узоры для однорядной плитки! Вместо этого вы можете искать, используя их Creator ID.

Создатель: mellissenpai
Идентификатор создателя: MA-7011-8313-9106
Terracota Thin 1
Артикул:
MO-1R9N-F27F-4BN3
Terracota Thin 2
Артикул:
MO-7JR7-WDJJ-YGK0
Terracota Thin 3
Код дизайна:
MO-B8G3-DLQ8-5QHW
Terracota Thin 4
Код дизайна:
MO-W3M0-KNSQ-YRKX


Еще один дизайн границы пути от пользователя Twitter mellissenpai, подходящий для каменной дорожки.

Вы можете заглянуть на ее страницу, чтобы увидеть больше ее работ! Для этого дизайна существует 18 шаблонов, поэтому мы рекомендуем вместо этого поискать их Creator ID.

Создатель: mellissenpai
Идентификатор создателя: MA-7011-8313-9106
Камень Круглый U-L
Код проекта:
MO-0YSW-V565-2JP8
Камень Круглый U-R
Код проекта:
MO-M6KX-3PSF-L449
Камень Круглый D-L
Артикул:
MO-9XBC-G20S-RFD8
Камень Круглый D-R
Артикул:
MO-13XT-9SMX-FBH6


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

Для этого дизайна есть 34 шаблона, включая закругленные, поэтому мы рекомендуем вместо этого поискать их Creator ID!

Создатель: mellissenpai
Идентификатор создателя: MA-7011-8313-9106
Brick Up
Код проекта:
MO-KJLM-36BV-XN61
Кирпичный вниз
Код проекта:
MO-6Q69-L3PB-YWFD
Кирпич левый
Код проекта:
MO-C03G-KY20-1SLL
Кирпич правый
Код проекта:
MO-76MQ-5J7S-BNVL

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

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

Вы также можете отправить нам личное сообщение в нашей учетной записи Twitter @ Game8_ACNH!
Доска для акций нестандартного дизайна (201)


Прежде чем вы сможете использовать эту функцию, вам необходимо открыть на своем острове ателье Able Sisters.
Как открыть ателье Able Sisters


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

Портал нестандартных дизайнов - Как поделиться индивидуальными дизайнами в Интернете

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


Руководства по индивидуальному дизайну

.

пользовательских кодов пути для использования в Animal Crossing: New Horizons

Игроки имеют доступ ко множеству различных типов путей в Animal Crossing: New Horizons, но игроки также могут использовать собственные шаблоны для своих островов.

После того, как игроки разблокируют приложение Island Designer на своем NookPhone в Animal Crossing: New Horizons , игроки могут приобрести возможность прокладывать дорожки через Nook Stop. Несмотря на то, что есть много готовых дизайнов дорожек, которые игрок может приобрести, они также могут купить возможность создавать пути с индивидуальным дизайном.

Игроки могут загружать пользовательские выкройки, созданные другими игроками, через киоск в задней части ателье Able Sisters. Для доступа к этим функциям требуется подключение к Интернету и платное членство Nintendo Switch Online.

СВЯЗАННЫЙ: Используйте эти коды Animal Crossing: New Horizons, чтобы получить наряды, основанные на аниме

Дорожки

Эти узоры можно использовать в приложении Island Designer, чтобы выложить острова игроков.Их также можно просто выложить на земле острова, если у игроков еще нет приложения Island Designer. Пути, которые включают в себя левую и правую части, предназначены для разметки, поэтому левая и правая части не предназначены для использования через приложение Island Designer.

Дополнения

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

Чтобы разблокировать приложение Island Designer, игроки должны сначала разблокировать K.К. Слайдер. После того, как он будет разблокирован и кредиты разыграны, Том Нук предоставит игрокам доступ к приложению.

После разблокировки для них станет доступна функция Animal Crossing: New Horizons : терраформирование острова.Конечно, еще одна доступная функция - это возможность прокладывать дорожки прямо в земле.

Многие игроки использовали свои паттерны и способности терраформирования для воссоздания различных локаций, таких как Хайрул.Благодаря этим функциям игроки действительно могут создать именно тот остров, который они хотят, - от тропического убежища до пригородного города. Со временем обязательно появятся более великолепные шаблоны, которыми можно будет поделиться с игроками по всему миру.

Animal Crossing: New Horizons уже доступна исключительно для Nintendo Switch.

БОЛЬШЕ: используйте эти коды Animal Crossing: New Horizons, чтобы получить наряды, основанные на фильмах и ТВ

da heroes

Dragon Age 4: Невоспетые герои, которым нужно время в центре внимания

Об авторе Сэм Вудрик (Опубликовано 260 статей)

Сэм - автор руководств для GameRant, а также независимый дизайнер игр.Сэм больше всего любит игры ужасов, когда дело касается создания и игры. Однако она играет в игры всех жанров и больше всего любит играть в игры с друзьями и семьей. Читатели могут подписаться на нее в Twitter @IceWoodrick

. Ещё от Sam Woodrick .

Advanced MapKit Tutorial: пользовательские плитки MapKit

Обновление примечания : Адам Раш обновил это руководство до Xcode 11, iOS 13 и Swift 5. Майкл Кац написал оригинал.

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

К сожалению, это означает, что большинство карт в разных приложениях выглядят одинаково.Booooooring!

В этом руководстве рассказывается, как включать карты, нарисованные от руки, в ваши приложения вместо карт, созданных программно, как это использует Pokémon GO. Вы узнаете, как:

  • Замените существующие плитки MapKit другим набором плиток.
  • Создавайте собственные плитки для отображения на карте.
  • Добавьте на карту пользовательские наложения.

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

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

Чтобы создать собственные плитки MapKit, вам сначала нужно научиться отображать карту. Чтобы познакомиться с MapKit, ознакомьтесь с учебником по MapKit: Начало работы
или видеокурсом MapKit и Core Location.

Начало работы

Начните с загрузки материалов проекта с помощью кнопки Загрузить материалы вверху или внизу этого руководства.Откройте стартовый проект и проверьте файлы проекта.

MapQuest - это начало веселой приключенческой игры. В реальной жизни герой бегает по Центральному парку Нью-Йорка, но отправляется в приключения, сражается с монстрами и собирает сокровища в альтернативной реальности. У него милый детский дизайн, чтобы игроки чувствовали себя комфортно и показывали, что игра не такая уж серьезная.

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

В проекте два тяжеловесных файла:

  • MapViewController.swift : Управляет видом карты и обрабатывает логику взаимодействия с пользователем и изменения состояния.
  • Game.swift : Содержит игровую логику и управляет координатами некоторых игровых объектов.

Основной вид игры - это MKMapView . MapKit использует плитки с различными уровнями масштабирования, чтобы заполнить вид и предоставить информацию о географических объектах, дорогах и т. Д.

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

Вид карты состоит из множества плиток, которые загружаются динамически, когда вы перемещаетесь по виду.Плитки имеют размер 256 на 256 пикселей и расположены в сетке, соответствующей проекции карты Меркатора.

Чтобы увидеть карту в действии, создайте и запустите приложение.

Вау! Какой красивый город. Основным интерфейсом игры является локация, а это значит, что без посещения Центрального парка нечего посмотреть и чем заняться. Но не волнуйтесь, вам пока не нужно покупать билет на самолет.

Место проведения испытаний

В отличие от других руководств, MapQuest - это функциональное приложение сразу после выхода! Но если вы не живете в Нью-Йорке, вы мало что сможете сделать с приложением.К счастью, в Xcode есть как минимум два способа решения этой проблемы.

Моделирование местоположения

Пока приложение все еще работает в iPhone Simulator , установите местоположение пользователя, перейдя в Features ▸ Location ▸ Custom Location… и установив Latitude на 40.767769 и Longitude на -73.971870 .

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

После избиения беспомощного гоблина приложение отправит вас в зоопарк. Обратите внимание на синюю точку.

Моделирование приключения

Статическое местоположение полезно для тестирования многих приложений на основе определения местоположения. Однако эта игра требует посещения нескольких локаций в рамках приключения. Симулятор может имитировать смену локации для пробежки, езды на велосипеде и вождения.Эти предварительно включенные поездки предназначены для Купертино, но у MapQuest есть встречи только в Нью-Йорке.

Подобные случаи требуют моделирования местоположения с помощью файла GPX или GPS Exchange Format. Этот файл определяет путевые точки, и симулятор интерполирует маршрут между ними.

Создание этого файла выходит за рамки данного руководства, но пример проекта включает для вас тестовый файл GPX.

Откройте редактор схем в Xcode, выбрав Продукт ▸ Схема ▸ Редактировать схему… .

Выберите Run на левой панели, затем вкладку Options справа. В разделе Core Location установите флажок Allow Location Simulation . В раскрывающемся списке Default Location выберите Game Test .

Теперь приложение будет имитировать перемещение между путевыми точками, указанными в Game Test.gpx .

Сборка и запуск.

В симуляторе ваш персонаж дойдет от метро 5-й авеню до зоопарка Центрального парка, где вам снова придется сразиться с гоблином.После этого отправляйтесь во флагманский магазин вашей любимой фруктовой компании, чтобы купить улучшенный меч. Как только вы закончите цикл, приключение начнется заново.

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

Замена плитки с помощью OpenStreetMap

OpenStreetMap - это открытая база данных картографических данных, поддерживаемая сообществом. Вы можете использовать эти данные для создания фрагментов карты, как это использует Apple Maps. Сообщество OpenStreetMap предоставляет больше, чем простые дорожные карты, они также предлагают специализированные карты для топографии, езды на велосипеде и художественной визуализации.

Примечание : Политика плитки OpenStreetMap предъявляет строгие требования к использованию данных, атрибуции и доступу к API. Перед использованием плиток в рабочем приложении проверьте соответствие.

Создание нового наложения

Для замены фрагментов карты необходимо использовать MKTileOverlay для отображения новых фрагментов поверх стандартных Apple Maps.

Откройте MapViewController.swift и замените setupTileRenderer () на следующее:

 private func setupTileRenderer () { // 1 let template = "https: // tile.openstreetmap.org/{z}/{x}/{y}.png " // 2 let overlay = MKTileOverlay (urlTemplate: шаблон) // 3 overlay.canReplaceMapContent = true // 4 mapView.addOverlay (наложение, уровень: .aboveLabels) // 5 tileRenderer = MKTileOverlayRenderer (tileOverlay: наложение) } 

По умолчанию MKTileOverlay поддерживает загрузку плиток с использованием URL-адреса, созданного по шаблону для указания пути к плитке.

Вот что делает код выше:

  1. Сначала вы объявляете шаблон URL для получения плитки из API OpenStreetMap.Вы заменяете {x} , {y} и {z} во время выполнения координатами отдельного фрагмента. То, насколько пользователь увеличил карту, определяет координату z или координату уровня масштабирования. X и y - это индекс плитки для отображаемого участка Земли. Вам необходимо предоставить плитку для каждой координаты x и y для каждого поддерживаемого вами уровня масштабирования.
  2. Затем вы создаете наложение.
  3. Затем вы указываете, что плитки непрозрачны и должны заменить плитки карты по умолчанию.
  4. Вы добавляете оверлей в mapView . Пользовательские плитки MapKit могут располагаться либо над дорогами, либо над надписями (например, с названиями дорог и мест). Плитки OpenStreetMap поставляются с предварительно нанесенными метками, поэтому они должны располагаться над метками Apple.
  5. Наконец, вы создаете средство визуализации плитки, которое обрабатывает отрисовку плиток.

Прежде чем плитки могут появиться, необходимо настроить средство визуализации плитки с помощью MKMapView . Итак, ваш следующий шаг - добавить следующую строку в конец viewDidLoad () :

 mapView.делегат = себя 

Это устанавливает MapViewController как делегат своего mapView .

Затем в расширение MKMapViewDelegate добавьте следующий метод:

 func mapView ( _ mapView: MKMapView, renderer Для наложения: MKOverlay ) -> MKOverlayRenderer { вернуть tileRenderer } 

Средство визуализации наложения сообщает представлению карты, как рисовать наложение. Средство визуализации фрагментов - это специальный подкласс для загрузки и рисования фрагментов карты.

Вот и все! Выполните сборку и запустите, чтобы увидеть, как OpenStreetMap заменяет стандартную карту Apple. Но как это может работать всего с несколькими строками кода?

На этом этапе вы действительно можете увидеть разницу между картами с открытым исходным кодом и Apple Maps!

Разделение Земли

Магия наложения плитки заключается в возможности преобразования пути плитки в конкретный ресурс изображения. Три координаты представляют путь плитки: x , y и z .X и y соответствуют индексам на поверхности карты, 0,0 - верхний левый фрагмент. Координата z представляет уровень масштабирования и определяет, сколько плиток составляют всю карту.

На уровне масштабирования 0 сетка 1 × 1, требующая одного тайла, представляет весь мир:

На уровне масштабирования 1 вы делите весь мир на сетку 2 × 2. Для этого требуется четыре плитки:

На уровне 2 количество строк и столбцов снова удваивается, требуется шестнадцать плиток:

Этот шаблон продолжается, увеличивая в четыре раза как уровень детализации, так и количество плиток на каждом уровне масштабирования.Для каждого уровня масштабирования требуется 22 * ​​z плитки, вплоть до уровня масштабирования 19, для которого требуется 274 877 906 944 плитки!

Теперь, когда вы заменили плитки Apple на OpenStreetMap, пришло время сделать шаг вперед и показать ваши собственные полностью настраиваемые плитки MapKit!

Создание пользовательских листов MapKit

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

Однако для уровня масштабирования 16 потребуется 4 294 967 296 тайлов для всей планеты! Чтобы нарисовать эти плитки от руки, потребуется больше жизни.

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

Поскольку начальный проект включает предварительно обработанные плитки для этой игры, вам просто нужно их загрузить. К сожалению, общего шаблона URL-адреса недостаточно, потому что вы хотите, чтобы ваша игра корректно завершалась сбоем, если средство визуализации запрашивает одну из миллиардов плиток, не включенных в приложение.

Для этого вам понадобится собственный подкласс MKTileOverlay .Добавьте один, открыв AdventureMapOverlay.swift и добавив следующий код:

 class AdventureMapOverlay: MKTileOverlay { переопределить URL-адрес функции (путь forTilePath: MKTileOverlayPath) -> URL { пусть tileUrl = "https://tile.openstreetmap.org/\(path.z)/\(path.x)/\(path.y).png" URL возврата (строка: tileUrl)! } } 

Это устанавливает подкласс и заменяет базовый класс, используя шаблонный URL-адрес, на специальный генератор URL-адресов.

Пока оставьте плитки OpenStreetMap, чтобы протестировать настраиваемое наложение.

Откройте MapViewController.swift и замените setupTileRenderer () на следующее:

 private func setupTileRenderer () { let overlay = AdventureMapOverlay () overlay.canReplaceMapContent = true mapView.addOverlay (наложение, уровень: .aboveLabels) tileRenderer = MKTileOverlayRenderer (tileOverlay: наложение) } 

Это меняет местами пользовательский подкласс вместо оверлея, предоставляющего тайлы OpenStreetMap.

Постройте и снова запустите. Игра выглядит точно так же, как и раньше. Ура!

Вы используете подкласс MKTileOverlay , но все еще загружаете данные OpenStreetMap в этот подкласс. Затем вы замените эти плитки своими собственными плитками MapKit.

Загрузка предварительно обработанных тайлов

А теперь самое интересное. Откройте AdventureMapOverlay.swift и замените URL-адрес (forTilePath :) следующим:

 переопределить URL-адрес функции (путь forTilePath: MKTileOverlayPath) -> URL { let tilePath = Bundle.main.url ( forResource: "\ (path.y)", withExtension: "png", подкаталог: "плитки / \ (path.z) / \ (path.x)", локализация: нет) } 

Здесь вы пытаетесь найти совпадающую плитку в пакете ресурсов, используя известную схему именования. Это найдет файлы, которые уже загружены в ваш проект. В начальном проекте вы можете найти их в папке tile . Вы заметите, что плитки сгруппированы в папки по их координате z, а затем снова сгруппированы по координате x.Сами файлы представляют собой PNG, названные по их координате y.

Затем добавьте следующий код в конец метода:

 if let tile = tilePath { возврат плитки } else { вернуть Bundle.main.url ( forResource: "пергамент", withExtension: "png", подкаталог: "плитки", локализация: нет)! } 

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

Постройте и снова запустите. Теперь вы увидите настраиваемую карту.

Попробуйте увеличивать и уменьшать масштаб, чтобы увидеть различные уровни детализации.

Если вы сейчас слышите телефонный звонок, это значит, что сотрудники Apple пытаются перенести вашу игру в Apple Arcade. ;]

Ограничение уровня масштабирования

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

К счастью, это легко исправить. Откройте MapViewController.swift и добавьте следующие строки в конец setupTileRenderer () :

.
 overlay.minimumZ = 13 overlay.maximumZ = 16 

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

Вы можете пойти еще дальше и ограничить масштабирование слишком далеко. Откройте MapViewController.swift и добавьте следующие строки под initialRegion в viewDidLoad ()

 mapView.cameraZoomRange = MKMapView.CameraZoomRange ( minCenterCoordinateDistance: 7000, maxCenterCoordinateDistance: 60000) mapView.cameraBoundary = MKMapView.CameraBoundary ( CoordinateRegion: initialRegion) 

Здесь вы используете cameraZoomRange и cameraBoundary , чтобы ограничить возможность увеличения вашего initialRegion .

Создание плиток

Шансы, что вы читаете это руководство по созданию фантастической приключенческой игры, очень малы. В этом разделе вы узнаете, как создавать собственные плитки MapKit, соответствующие вашим потребностям.

Примечание : Этот раздел является необязательным, так как он описывает, как рисовать определенные плитки. Чтобы перейти к другим методам MapKit, перейдите к разделу Fancifying the Map .

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

Откройте папку проекта и посмотрите MapQuest / tile / 14/4825 / 6156.png . На этой плитке показана нижняя часть Центрального парка с уровнем масштабирования 14. Приложение содержит десятки этих маленьких изображений, которые образуют карту Нью-Йорка, где происходит игра. Каждый был нарисован вручную с использованием элементарных навыков и инструментов.

Выбор плитки, которая вам нужна

Первый шаг к созданию собственной карты - это выяснить, какие плитки вам нужно будет нарисовать.Для начала загрузите исходные данные из OpenStreetMap и используйте такой инструмент, как MapNik, для создания из них изображений листов.

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

В AdventureMapOverlay.swift добавьте следующую строку к URL-адресу (forTilePath :) :

 print ("запрошенный фрагмент \ tz: \ (path.z) \ tx: \ (path.x) \ ty: \ (path.y) ") 

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

Примечание : Если вы работаете на симуляторе, вы, вероятно, увидите множество ошибок вида Ошибка компилятора: недопустимый файл библиотеки в консоли Xcode. Это ошибка симулятора, и ее можно спокойно игнорировать. К сожалению, это делает консоль довольно шумной, что затрудняет просмотр результатов вашего print операторов.

Далее вам нужно получить плитку источника и настроить ее. Вы можете повторно использовать схему URL-адресов, указанную ранее, чтобы получить плитку OpenStreetMap.

Следующая команда терминала захватит плитку и сохранит ее локально.

 curl --create-dirs -o z / x / y.png https://tile.openstreetmap.org/z/x/y.png 

Вы можете изменить URL-адрес, заменив x, y и z конкретным путем на карте. Для южной части Центрального парка попробуйте:

 завиток --create-dirs -o 14/4825/6156.png \ https://tile.openstreetmap.org/14/4825/6156.png 

Эта структура каталогов - уровень масштабирования / x-координата / y-координата - упрощает поиск и использование плиток в дальнейшем.

Настройка внешнего вида

Следующим шагом будет использование базового образа в качестве отправной точки для настройки. Откройте плитку в своем любимом редакторе изображений. Например, так это выглядит в Pixelmator:

Теперь вы можете использовать кисть или карандаш, чтобы рисовать дороги, тропинки или интересные объекты.

Если ваш инструмент поддерживает слои, рисование различных объектов на отдельных слоях позволит вам настроить их так, чтобы они выглядели лучше. Использование слоев делает рисование более щадящим, так как вы можете использовать другие функции, чтобы скрыть беспорядочные линии.

Теперь повторите этот процесс для всех плиток в наборе, и все готово. Как видите, это займет немного времени.

Вы можете немного упростить процесс:

  • Сначала объедините все плитки для всего слоя.
  • Нарисуйте пользовательскую карту.
  • Разделите карту на плитки.

Укладка плитки

После создания новых плиток поместите их обратно в структуру папок плитки / уровень масштабирования / x-координата / y-координата в проекте. Благодаря этому вещи будут организованы и легко доступны.

Это также означает, что вы можете легко получить к ним доступ, как вы это делали в коде, добавленном для URL-адреса (forTilePath :) .

 let tilePath = Bundle.main.url ( forResource: "\ (path.y)", withExtension: "png", подкаталог: "плитки / \ (path.z) / \ (path.x)", локализация: нет) 

Вот и все. Вы готовы начать рисовать красивые карты!

Изучение карты

Карта выглядит великолепно и соответствует эстетике игры. Но есть еще много всего, что нужно настроить!

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

Замена пользовательской аннотации

Начните заменять значок своего героя, открыв MapViewController.swift и добавив следующий метод в расширение MKMapViewDelegate :

 func mapView ( _ mapView: MKMapView, viewFor аннотации: MKAnnotation ) -> MKAnnotationView? { переключить аннотацию { // 1 случай пусть пользователь как MKUserLocation: // 2 если разрешить existingView = mapView .dequeueReusableAnnotationView (withIdentifier: "пользователь") { вернуть existingView } else { // 3 let view = MKAnnotationView (аннотация: пользователь, reuseIdentifier: "пользователь") view.image = #imageLiteral (имя ресурса: "пользователь") Вернуться мнение } дефолт: вернуть ноль } } 

Этот код создает настраиваемое представление для пользовательской аннотации. Вот как:

  1. Если MapKit запрашивает MKUserLocation , вы вернете пользовательскую аннотацию.
  2. Представления карты содержат пул многоразовых представлений аннотаций для повышения производительности. Сначала вы пытаетесь найти представление для повторного использования и вернуть его, если оно есть.
  3. В противном случае вы создаете новый вид. Здесь вы используете стандартный MKAnnotationView , который довольно гибок. Здесь вы используете его только для изображения авантюриста.

Сборка и запуск. Вместо синей точки вы теперь увидите блуждающую фигурку из палочек.

Не самый героический из героев, но тем не менее герой! :]

Аннотации для определенных мест

MKMapView также позволяет отмечать ваши собственные достопримечательности.MapQuest подыгрывает метрополитену Нью-Йорка, рассматривая систему метро как большую большую варп-сеть, позволяющую телепортироваться с одной станции на другую.

Чтобы это было понятно вашим игрокам, вы добавите на карту несколько маркеров ближайших станций метро. Откройте MapViewController.swift и добавьте следующую строку в конец viewDidLoad () :

 mapView.addAnnotations (Game.shared.warps) 

Сборка и запуск. На некоторых станциях метро теперь есть значки.

Как и синяя точка, которая раньше показывала местоположение пользователя, эти стандартные метки не соответствуют эстетике игры. На помощь приходят пользовательские аннотации.

В mapView (_: viewFor :) добавьте следующий регистр к switch , над регистром по умолчанию:

 case let warp as WarpZone: если разрешить existingView = mapView.dequeueReusableAnnotationView ( withIdentifier: WarpAnnotationView.identifier) ​​{ existingView.annotation = аннотация вернуть existingView } else { return WarpAnnotationView ( аннотация: деформация, reuseIdentifier: WarpAnnotationView.identifier) } 

Используйте тот же шаблон, что и ранее, для аннотации. Если есть уже существующий, верните его, в противном случае создайте новый. Собери и запусти снова.

В представлении настраиваемых аннотаций теперь используется шаблонное изображение и цвет для конкретной линии метро.Если бы только метро было мгновенным перекосом в реальной жизни!

Использование пользовательского рендеринга наложения

MapKit предлагает множество способов украсить карту для игры. На следующем шаге вы воспользуетесь преимуществом одного из них, используя MKPolygonRenderer , чтобы нарисовать эффект мерцания на основе градиента на резервуаре.

Начните с замены setupLakeOverlay () в MapViewController.swift на:

 private func setupLakeOverlay () { // 1 let lake = MKPolygon ( координаты: & Game.общий. резервуар, count: Game.shared.reservoir.count) mapView.addOverlay (озеро) // 2 shimmerRenderer = ShimmerRenderer (оверлей: озеро) shimmerRenderer.fillColor = #colorLiteral ( красный: 0,2431372549, зеленый: 0,5803921569, синий: 0,9764705882, альфа: 1) // 3 Timer.scheduledTimer (withTimeInterval: 0,1, повторы: истина) {[слабый я] _ в сам? .shimmerRenderer.updateLocations () сам? .shimmerRenderer.setNeedsDisplay () } } 

Это устанавливает новый оверлей от:

  1. Создание MKPolygon той же формы, что и резервуар.Эти координаты предварительно запрограммированы в Game.swift .
  2. Настройка настраиваемого средства визуализации для рисования многоугольника со специальным эффектом. ShimmerRenderer использует Core Graphics для рисования многоугольника и градиента поверх многоугольника.
  3. Поскольку средства визуализации оверлея не предназначены для анимации, для обновления наложения устанавливается таймер 100 мс. Каждый раз, когда наложение обновляется, градиент немного сдвигается, создавая эффект мерцания.

Затем замените mapView (_: rendererFor :) на:

 func mapView ( _ mapView: MKMapView, renderer Для наложения: MKOverlay ) -> MKOverlayRenderer { если наложение AdventureMapOverlay { вернуть tileRenderer } else { вернуть shimmerRenderer } } 

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

Строй и беги, затем панорамируй по водоему, чтобы увидеть Мерцающее море!

Поздравляем! Вы узнали, как использовать MapKit для создания пользовательских карт для ваших приложений.

Куда идти дальше?

Загрузите файлы завершенного проекта, нажав кнопку Загрузить материалы вверху или внизу руководства.

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

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

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

Наконец, если вы хотите еще больше расширить представления MapKit, взгляните на учебник MapKit: Overlay Views.

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

Данные и изображения OpenStreetMap принадлежат © OpenStreetMap. Данные карты доступны по лицензии Open Database License, а данные листов картографии лицензированы как CC BY-SA.

raywenderlich.com Еженедельно

Информационный бюллетень raywenderlich.com - это самый простой способ оставаться в курсе всего, что вам нужно знать как разработчику мобильных приложений.

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

.

Смотрите также