Разрушаемый ландшафт с помощью Tilemap

уроки, мануалы, советы по Construct 2

Сообщение Разрушаемый ландшафт с помощью Tilemap
» 18 фев 2015, 15:02

Здравствуйте!
Сейчас я покажу вам мою идею разрушаемого ландшафта с использованием TileMap. Кто не знает что это, раскройте вкладку снизу.
 
equinox писал(а):
Tilemap



Оригинал.
Обратно в каталог плагинов.

Объект "Тайлмэп" (тайловая карта) позволяет проще создавать игры, основанные на тайлах. Тайлы - это отдельные строительные элементы-изображения, которые могут быть использованы повторно.

Рекомендованные настройки.
При добавлении объекта Tilemap Construct 2 может предложить вам рекомендованные установки для основанных на тайлах играх. Это Point sampling (поточечная выборка, простой низкоресурсоемкий способ выбора цвета пиксела на основе выбора одного из текстурных пикселей (текселей)), Pixel rounding (Округление пиксела), установленное в положение "да", scalefullscreen mode (полноэкранный режим) = Letterbox integer. Настоятельно рекомендуется использовать эти установки во избежание появления швов между и вдоль тайлов. Швы могут возникнуть в результате масштабирования дисплея или скроллинга (например, скроллинг половины пути между пикселами и остановка в координате 100.5 или использование нецелочисленного метода масштабирования леттербокса (non-integer letterbox scale), который может принимать значения на подобии 1.7х. Принятие рекомендованных настроек помогает избежать проблемы появления швов.


Изображение для объекта Tilemap.
Изображение, используемое для объекта Tilemap называется tileset (тайлсет, набор тайлов). Это изображение, которое содержит каждый отличающийся тайл. Помимо тайлов в карте могут быть также опционально добавлены отступы от края и отступы между тайлами. Тайлсет появляется на панели Tilemap Bar после выбора объекта, которая позволяет вам выбрать какие тайлы будут использованы для того, чтобы отрисовать этот объект.

Столкновения.
При тестировании столкновений с объектом пустые (стертые) тайлы будут считаться как не участвующие в столкновении. Остальные считаются как участвующие в столкновении. Настраиваемый многоугольник столкновений может быть установлен на отдельном тайле путем щелчка на кнопке Edit tile collision polygon (изменить многоугольник коллизий) или двойной щелчок на таиле на панели тайловой карты. Обратите внимание, что многоульник коллизий не может быть полностью уничтожен на существующем тайле. Для уничтожения многоугольника необходимо стереть тайл.
Если вы хотите иметь тайлы, которые видимы, но не участвуют в расчете столкновений, то используйте два объекта тайловых карт, наложенных друг на друга. Тестируйте столкновения только для верхнего объекта и сотрите все тайлы, которые не должны участвовать в столкновениях. Эти тайлы будут расположены на нижней тайловой карте (которую вы не выбрали для расчета столкновений), поэтому они будут видимы, но интактны.

Идентификаторы тайлов (Tile IDs).
Каждый тайл в тайлсете имеет индекс для идентификации. Нумерация вагонов начинается с 0. Первый тайл располагается слева-сверху, индекс инкрементно возрастает слева-направо и от ряда к ряду. Идентификатор тайла может быть легко просмотрен при наведении мыши на тайл на панели тайлов. Идентификатор тайла полезен для сравнения или установки тайлов во время работы программы с помощью условий, действий и выражений объекта. Вы можете конвертировать координаты тайла в общие координаты и обратно (подробнее смотрите в выражениях объекта Тайлмэп.

Ненадлежащее использование объекта.
Карта тайлов не подходит для использования больших изображений. Тайловая карта рисуется тайл за тайлом, но может оптимизировать процесс, если есть зоны с повторяющимися тайлами. Если вы вставите большое изображение в объект Тайловой карты и затем отпечатаете на ней сетку тайлов для того, чтобы отобразить большое изображение, вы не получите никакой оптимизации. Если изображению необходима сетка в 10 на 10 тайлов для того, чтобы быть выведенным на экран, то это потребует 100 обращений "нарисовать объект". Одно изображение или объект Tiled Background потребует для сравнения всего 1 такое обращение. Таким образом, карта тайлов должна использовать только в том случае, если вы собираетесь интенсивно использовать ее свойства повторного употребления ее тайлов в ходе прорисовки.


Свойства объекта Tilemap.

1. Image - нажмите на ссылку Edit (редактировать) для того, чтобы изменить исходное изображение, на основе которого тайлы будут отрисованы.
2. Initial visibility - выбирает, будет ли объект видимым или нет при старте программы.
3. Tile width/Tile height - размер тайлов в карте тайлов в пикселах. Рекомендуем использовать квадратные тайлы с длиной ребра, равной степени 2 (16*16, 32*32...)
4. Tile X offset/Tile Y offset - отступ в пикселах верхнего левого тайла от верхнего левого угла загруженного изображения. Обычно устанавливать отступ не требуется, свойство предоставляется в большей степени для совместимости с уже существующими картами тайлов, которые были нарисованы с отступом от края изображения.
5. Tile X spacing/Tile Y spacing - отступ в пикселах между тайлами в общем изображении. Обычно, устанавливать это значение не требуется. Свойство необходимо для совместимости с картами, которые были отрисованы с отступами между оттделььными тайлами.

Условия объекта Tilemap.

1. Compare tile at - сравнивает идентификатор тайла на заданной позиции в карте.
2. Compare tile state at - проверяет тайл на заданной позиции на предмет наличия переворота или поворота относительно нормального положения.

Действия объекта Tilemap.

1. Download - вызывает сохранение данных текущей карты из выражения TilesJSON как JSON файл. Это может быть полезно для встроенных редакторов уровней.
2. Load - загружает текущие тайлы из строки данных JSON из предыдущего использования выражения TilesJSON.
3. Erase tile - стирает тайл на заданной позиции.
4. Erase tile range - стирает прямоугольную зону тайлов на карте.
5. Set tile - устанавливает заданный по идентификатору тайл на заданную позицию. Опционально тайл может быть перевернут или развернут.
6. Set tile range - как и предыдущее, но устанавливает прямоугольную область тайлов.
7. Set tile state - устанавливает перевернутое или повернутое положение для заданной позиции на карте. Идентификаторы тайлов не меняются.
8. Set tile state range - то же, что и предыдущее, но для прямоугольной области, содержащей группу тайлов.

Выражения объектов Tilemap.

1. TilesJSON - возвращает данные о тайле в JSON формате, который может быть в дальнейшем снова загружен при помощи действия Load. Обратите внимание, что это выражение отличается от встроенного выражения AsJSON, которое возвращает полное состояние объекта (включая позицию, размер, поведения и прочее), в то время как TilesJSON возвращает только данные тайла.
2. PositionToTileX(x)/PositionToTileY(y) - конвертирует координаты лэйаута в координаты карты тайлов. Это может быть использовано для получения позиции мыши над тайлом.
3. SnapX(x)/SnapY(y) - осуществляет привязку Х или У координаты лэйаута к ближайшему тайлу. Также возвращает координаты лэйаута, но выровненные по ближайшему тайлу в карте.
4. TileAt(x, y) - возвращает идентификатор тайла на заданной позиции в карте. Обратите внимание, что позиция будет дана в координатах карты тайлов, а не в общих координатах лэйаута. Если тайл в заданной позиции пуст (был стерт), то выражение возвращает -1.
5. TileToPositionX(x)/TileToPositionY(y) - конвертирует координаты тайла в координаты лэйаута. Это может быть использовано для установки спрайта сверху данного тайла.

1.Теория.
Существует объект, который будет служить "разрушителем" тайл'ов. Он может быть как и пулей, как и платформером или TDS-объектом, неважно. Но в этом примере будет пуля, и так я её и буду называть.
При столкновении с тайлмап'ом, из координат пули будет вычитываться расстояние между началом лайаута и левого верхнего угла тайлмап'а. Таким образом, новые координаты пули (которые записаны в переменной и саму пулю никак не изменяют) запишутся так, будто бы координаты верхнего угла тайлмап'а - начало лайаута. Через небольшую операцию будет высчитываться индекс нужного тайл'а и будет происходить его удаление.
2.Программа.
Заготовка будущего проэкта:
zagotovka.capx
(173.16 КБ) Скачиваний: 238

Итак, приступим.
Ширину тайл'а вы можете сделать любую, хоть 1х1. Для начала нужно добавить объект без текстуры с размерами, равными размеру тайл'а и закрепить (PIN) к верхнему тайл'у тайлмап'а (Я назову его tilemappoint) и добавить две локальные переменные к пуле. Назовите их хоть как, главное, чтобы в названии фигурировали X и Y. Я назову их "PsevdoX" и "PsevdoY".
screenshot 1.png

Дальше добавим собыие:
Bullet - On collision with Tilemap | Set "PsevdoX" to "(floor((Bullet.X-tilemappoint.X)/32))"
Когда пуля касается тайлмап'а, В первую переменную записывается X-координата пули, из которой вычли X-координату Объекта- имэйджпоинта (то-есть, фактически, координату тайлмап'а), округлили вниз (floor) и поделили на длину тайл'а.
Тем самым мы из псевдокоординаты X получали индекс нужного тайла по оси X.
Проделайте в том же событии тоже самое с координатой Y в переменную "PsevdoY", но в формулу вычисления вместо "floor" запишите "round", который округляет дробь вверх. Это надо затем, что origin imagepoint у пули находится в противоположной стороне от тайлмап'а, и когда пуля касается его, oridgin im.p. не успевает "вонзиться" в тайл, из-за чего убирается клетка сверху (Которой не существует).
Далее в том же событии пропишите еще несколько эвентов: |Tilemap - Erase tile (Bullet.PsevdoX (+1,-1), Bullet.PsevdoY (+1,-1) ) . Это сотрет нужный тайл и еще сколько вам надо вокруг, не меньше 1 справа и слева. Делается это для того, чтобы при попадании пули в бок тайл'а,
он тоже уничтожался. Попробуйте попасть в бок с пулей, стирающей один тайл, и пуля не нанесет никакой вред тайл'у.
Ну и добавьте |bullet-destroy в конце события.
screenshot 2.png


Чтобы было более красиво, поставьте размер тайл'а на маленький (с 5x5 и выше), и не забудьте отредактировать код. А также пуля ВСЕГДА должна быть на как минимум один пиксель меньше тайл'а.
Все готово. Оставляйте свое мнение, говорите пожелания и улучшения системы под темой. Я все запишу :)
Исходник проекта:
landshaf v2.capx
(204.64 КБ) Скачиваний: 559

(Зажмите пробел чтобы стрелять как из пулемета)
(Нажмите Enter чтобы перезапустить)
(А также в этом исходнике размер тайл'а равен 5)

Не судите строго, это моя первая тема :3
Последний раз редактировалось Romatoid 19 фев 2015, 13:03, всего редактировалось 2 раз(а).
Аватара пользователя

Участник
Сообщений: 19
Я тут с 15 фев 2015
Откуда: Челябинск
VK: romatoid
Репутация 10 [ ? ]

Сообщение Разрушаемый ландшафт с помощью Tilemap
» 18 фев 2015, 18:26

Если сыро, то стоило ли вообще выкладывать?
И исходник нужно уже готовый выкладывать.
Аватара пользователя

Модератор
Сообщений: 2154
Я тут с 11 окт 2013
Откуда: Челябинск
Двиг: С2
Лицензия: Pirate
VK: night_silent
Репутация 223 [ ? ]

Сообщение Разрушаемый ландшафт с помощью Tilemap
» 18 фев 2015, 18:37

endermAH, Хорошо, в следующий раз учту
Аватара пользователя

Участник
Сообщений: 19
Я тут с 15 фев 2015
Откуда: Челябинск
VK: romatoid
Репутация 10 [ ? ]

Сообщение Разрушаемый ландшафт с помощью Tilemap
» 19 фев 2015, 00:29

Romatoid писал(а):в следующий раз учту

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

Администратор
Сообщений: 5706
Я тут с 05 сен 2012
Двиг: Construct2
Лицензия: Personal
Skype: c2community
VK: gabrielsailergray
Репутация 377 [ ? ]

Сообщение Разрушаемый ландшафт с помощью Tilemap
» 19 фев 2015, 12:10

Отредактировал. Теперь нормально? :)
Аватара пользователя

Участник
Сообщений: 19
Я тут с 15 фев 2015
Откуда: Челябинск
VK: romatoid
Репутация 10 [ ? ]

Сообщение Разрушаемый ландшафт с помощью Tilemap
» 19 фев 2015, 23:34

Мне очень понравилось, ибо в TileMap-ах слаб я :hii:
Изображение Изображение Изображение
Аватара пользователя

Игродел
Сообщений: 1117
Я тут с 25 ноя 2014
Репутация 133 [ ? ]

Сообщение Разрушаемый ландшафт с помощью Tilemap
» 20 фев 2015, 10:56

nagval333 писал(а):Мне очень понравилось, ибо в TileMap-ах слаб я

Спасибо :) Буду стараться делать еще что-нибудь интересное.
Аватара пользователя

Участник
Сообщений: 19
Я тут с 15 фев 2015
Откуда: Челябинск
VK: romatoid
Репутация 10 [ ? ]

Сообщение Разрушаемый ландшафт с помощью Tilemap
» 20 фев 2015, 20:45

Romatoid писал(а):Отредактировал. Теперь нормально? :)

да. теперь норм! :ok:
Аватара пользователя

Администратор
Сообщений: 5706
Я тут с 05 сен 2012
Двиг: Construct2
Лицензия: Personal
Skype: c2community
VK: gabrielsailergray
Репутация 377 [ ? ]

Сообщение Разрушаемый ландшафт с помощью Tilemap
» 24 июл 2015, 06:34

Romatoid писал(а):
nagval333 писал(а):Мне очень понравилось, ибо в TileMap-ах слаб я

Спасибо :) Буду стараться делать еще что-нибудь интересное.

один совет тот невидимый спрайт изрисуй цветами, главное сделай в опциях невидимым. А так продолжай в том же духе :good:
Не пройдя сквозь тьму, не увидеть света.
Crazy Stories
Аватара пользователя

Участник
Сообщений: 498
Я тут с 08 июл 2015
Откуда: Из цикла
Двиг: construct 2
Лицензия: personal
Репутация −4 [ ? ]

Сообщение Разрушаемый ландшафт с помощью Tilemap
» 24 июл 2015, 08:21

Зачем мы живём? Пытаешься заработать на жизнь, верно? Вкалываешь, зарабатываешь... Я тебя обломаю - однажды кое-кто заберёт у тебя ВСЁ. Не только материальные вещи, а вообще ВСЁ. Деньги, карьеру, семью, друзей. Однажды у тебя не будет НИЧЕГО что тебя сейчас окружает. Но что-же это за падлюка? Кто однажды заберёт у тебя всё? Ну, не у тебя всё заберут, а ТЕБЯ заберут из этого мира... Это - смерть. Она придёт к каждому. А ты живёшь так, будто ты бессмертен. Я, как и многие другие, слишком привязан к этому не вечному, материальному миру. А ведь мы с тобой когда-нибудь умрем. Мы с тобой лишимся всего, что нажили за всю жизнь. Так зачем тратить попусту время на все эти глупости? А как ты думаешь, кому будет легче в ином мире - тому, кто всю жизнь был привязан к этому миру, гонялся за всеми этими глупыми ценностями; или тот, кто по-настоящему свободен, тот, кто обходится без всего, что нас окружает? Каждый человек либо принадлежит этому миру, либо по-настоящему свободен.
Аватара пользователя

Участник
Сообщений: 284
Я тут с 31 авг 2013
Двиг: GDevelop
Репутация 35 [ ? ]



Вернуться в Уроки по Construct 2

Сейчас эту тему просматривают

Зарегистрированные пользователи: нет зарегистрированных пользователей

Наверх