Продолжаем разбираться в работе с этим классом.
В этой статье затронем вопросы транформаций и разбиения полигона.
Для начала давайте разберемся в общем и целом что из себя представляет полигон в сцене.
Добавляем в сцену Polygon2D, называем его «Ground», и рисуем его к примеру в координатах 100.100.
Соответственно размеры его будут 200х200, и находится он в нулевых координатах сцены.
Давайте выведем массив точек и посмотрим что получится.
Я рисовал полигон с верхнего левого угла по часовой стрелке. Так как рисовали его начиная с координаты 100.100 - в массиве первая точка полигона находится именно в этой координате. Далее вторая точка 300.100 - справа от первой. Затем вниз 300.300.. и далее.
Тут всё логично и пока всё понятно.
Давайте теперь изменим позицию всего полигона. Он сейчас находится в координате 0.0, сдвинем его в 100.100
посмотрим что будет выдавать полигон:
…а выдавать он будет всё тоже самое. Ибо координаты точек внутри полигона неизменны. Т.е вы можете двигать ноду по сцене, но данные массива полигона не будут изменяться под текущую координату ноды.
Давайте теперь всё, что обсуждалось выше рассмотрим на наглядном примере.
Добавим в сцену второй полигон, назовем его «cut». Нарисуем его сразу в нулевых координатах:
В коде укажем, что хотим таскать всегда CUT в районе курсора, а по клику вырезать полигон из GROUND.
Для клика я замапил заранее кнопку в настройках
Пришло время проверить. Стартуем, подносим CUT к GROUND. Жмем на мышку … но ничего не происходит.
Я уверен - вы догадались почему...
Точки полигона CUT остаются в нулевых координатах сцены, и соответственно полигон не участвует в вырезании так как он вообще далеко от GROUND.
Если мы сейчас чуть изменим полигон CUT , чтобы он сразу перекрывал GROUND, то результат будет виден.
Заметно что мы двигаем полигон, а вырезаются его оригинальные данные.
Очевидно , что для того чтобы всё работало так, как мы хотим - нам надо получить правильные координаты всех точек полигона в текущей позиции ноды.
Но так как менять позиции точек оригинального полигона нет смысла ( так как он сразу улетит с координат курсора), мы будем создавать «виртуальный» полигон, который и будет вырезать «дырку» в GROUND.
В коде создаем Polygon2D и новый массив. В цикле собираем позиции точек CUT и прибавляем к ним координаты курсора.
Потом это всё подаем в данные для нового полигона, и уже его вырезаем из GROUND.
В итоге - всё как и планировали !
Ну а раз так, то рано или поздно вы разрежете полигон насквозь , и увидите вот такую картину :
…давайте разбираться что происходит.
Логично заглянуть в то, что выдает нам Geometry в качестве результата.
Если внимательно присмотреться , то можно обнаружить что массивов внутри стало два !.
Ну и я уверен, что вы догадались что это значит.
Меняем нашу логику на следующую : если в результате Geometry нам выдал в результате больше чем один массив, то стартуем цикл и строим новые полигоны по этим данным. ( я крашу новый полигон в желтый цвет для наглядности)
В итоге получаем вот это:
Надеюсь вам эта информация была полезна.
В следующей статье будем разбираться с текстурированием полигонов.
Подписывайтесь на канал, вступайте в группу в ВК, и не забывайте что у нас есть дискорд сервер.
Удачи в изучении годо !