Найти тему
Игровой движок Godot engine

№191. Godot 4. Катаем квадратное. Практика.

Данная статья из раздела «практика», а посему будем решать конкретные задачи. В нашем случае - заставим катиться квадратный спрайт.

Для проекта нам потребуется спрайт с размерами 128х128 пикселей.

Поехали !

Вполне логичная идея - сделать смену точки вращения (pivot) в зависимости от текущего угла поворота.

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

-2

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

-3

В нашем случае у первой точки это будут координаты -128, -128

-4

Соответственно вторая точка будет -128, 0, третья 0,0, четвертая 0, -128.

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

Переносим логику в код. И проверяем.

-5
-6

Заметно что спрайт вращается и двигается. Но на стыке поворотов происходит какой то рывок.

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

Допишем это в условии:

-7

Необращаем внимание на получающийся спагетти код. Проверяем.

-8

В общем и целом всё сработало, но появилось две проблемы:
1) Спрайт заметно обгоняет курсор.
2) После 360 градусов спрайт улетает куда то не понятно куда.

Первая проблема решается довольно просто

-9
-10

А вот со второй надо поработать )

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

Дальше очевидно, что после 360 градусов наш код теряется , потому что спрайт начинается вращаться дальше…до 400, 500 градусов.
И понятно, что расписывать каждые +90 градусов в «if - else» это глупость.
Поэтому заводим еще одну переменную
c_angle, которая будет округляться после 360.
Её же и проставляем в условиях:

-11

Результат :

-12

А результат уже хорош !
Осталось только забороть вот эти «флики» на стыках поворотов.

Решается это просто : Нам надо в условиях добавить «больше или равно» вместо «больше»

-13

В результате :

-14

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

P.S.
Ну и чтобы совсем убрать спагетти, мы можем прибегнуть к массиву.
Складываем в него все наши позиции для оффсета. Заводим еще одну переменную которая будет считать обороты от 1 до 4.
И подключаем это дело в выборку.

-15

Ставьте лайк, подписывайтесь на канал, вступайте в группу в ВК, и не забывайте что у нас есть дискорд сервер.
Удачи в изучении годо !