Найти в Дзене
Игровой движок Godot engine

№238. Собираем простенький инвентарь. №1.

Приветствую тебя камрад. В этой небольшой серии статей покажу как реализовать простой инвентарь который будет представлять из себя блок с ячейками в которые мы будем перемещать предметы с игрового поля через перетаскивание мышкой. ВАЖНО. Вариантов создания инвентарей, их логики, кода и подходов есть великое множество. В данной статье автор не ставил своей целью создать ультра мега правильный и эталонный код.
Данный материал подойдет для начинающих. Для старта, для понимания взаимодействий в коде. Больше как начальная база для развития. В этой части напишем код для перетаскивания иконок на игровом поле. Для проекта в целом нам потребуются иконки.
У меня это набор из семи спрайтов размерами 32х32. Создаем общую сцену. Она пока будет у нас пустой. И создаем сцену для иконки. Нажимаем на Other Node и ищем ноду TextureRect Я назвал её s_icon, и подключил пока что пустой скрипт. В качестве текстуры кидаем любой спрайт наших иконок Так как у меня размеры спрайтов 32х32, что довольно мелко, в

Приветствую тебя камрад.

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

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

В этой части напишем код для перетаскивания иконок на игровом поле.

Для проекта в целом нам потребуются иконки.
У меня это набор из семи спрайтов размерами 32х32.

Создаем общую сцену. Она пока будет у нас пустой.

И создаем сцену для иконки. Нажимаем на Other Node и ищем ноду TextureRect

-2

Я назвал её s_icon, и подключил пока что пустой скрипт.

-3

В качестве текстуры кидаем любой спрайт наших иконок

-4

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

-5

Спрайты в проекте у меня переложены в папку stuff.

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

Открываем скрипт иконки, и начинаем накидывать код.

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

В функциях будем перебрасывать в родительскую ноду ( в нашем случае общую сцену которую мы создали в самом начале ) в переменную current_icon нашу иконку.

(на всякий случай , get_node(''..'') - это тоже самое что и get_parent())

-7

С иконкой пока всё, возвращаемся в сцену.

Я добавил в сцену Label , для того чтобы было проще отслеживать исполнение кода. В нашем случае «отлов» иконок.
И так же набросал иконок с разными текстурами на экран.
(Тут важно - это не просто текстуры, а сцены s_icon)

текстуры у иконок я заменил вручную после добавления в сцену
текстуры у иконок я заменил вручную после добавления в сцену

Далее код.
Тут всё тоже достаточно просто:
Объявляем ту самую переменную
current_icon в которую мы перекидываем иконку из скрипта иконки, и выводим в процессе в лейбл её значение.

-9

Если запустить код сеичас , то увидим вот такую картинку :

-10

В лейбл пробрасываются наши иконки, значит всё работает как надо.

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

Заходим в настройки проекта и добавляем левую кнопку мышки как click

-11

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

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

в новом спрайте я устанавливаю фильтрацию и размеры в 2Х.
в новом спрайте я устанавливаю фильтрацию и размеры в 2Х.

Проверяем что получилось.

-13

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

-14

Проверяем.
Если кликать на иконку то всё ок.

-15

Но если кликнуть на пустое место в сцене - получим ошибку.

Исправить это легко, просто добавив в логику проверку на наличие иконки :

-16

На этом эту часть можно заканчивать.

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

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

На этом всё.
Подписывайтесь на канал, при желании
вступайте в группу в ВК.
Удачи в изучении годо