#4 Godot: 3D Platformer от BornCG. Знакомство с GDScript, создание спрайта
Сегодня мы рассмотрим:
- основы языка программирования GDScript;
- создание анимированного изображения (спрайта).
Вот как выглядит наш проект на текущий момент.
И вот как он играется.
С первой задачей из списка мы расправимся элегантно: для GDScript написана хорошая документация и даже на русском языке (можете и не читать, всё необходимое для прохождения этого курса мы добудем в бою).
Кстати, поработать с GDScript в отрыве от реальности можно тут.
А теперь приступим к созданию нового объекта на нашей сцене. К корневому узлу Level1 добавляем новый дочерний узел Sprite3D, который по сути является простым плоским изображением.
Обращаем внимание, что в Инспекторе свойство Texture из группы Sprite3D для нашего нового узла является пустым.
Очевидно, нам нужно добавить какое-нибудь изображение - пока хотя бы для примера. Обращаем внимание (х2), что в панели файловой системы у нас есть файл icon.svg...
Перетаскиваем файл icon.svg из панели файловой системы прямиком в свойство Texture.
Немного меняем позицию спрайта и смотрим, что получилось.
На нашей сцене теперь имеется плоская поверхность, которая к тому же не является физическим объектом - это просто картинка. Тем не менее, добавили эту картинку мы не просто так, а чтобы попрактиковаться в коде.
Переименовываем узел Sprite3D в, например, Icon и нажимаем на кнопку Прикрепить новый или существующий скрипт к выбранному узлу.
Как видите, мы перешли во вкладку работы с кодом (активна кнопка Script в верхней части рабочего пространства), и из двух имеющихся в проекте файлов с кодом выбран новый добавленный.
Вот что мы имеем:
Здесь нам интересны две вещи:
- функция _ready() вызывается, когда узел впервые загружается на сцену, то есть данная функция выполняется только один раз при старте игрового уровня;
- функция _process(delta) выполняется постоянно в процессе игры, и частота её выполнения равняется частоте кадров в секунду (FPS). Параметр delta — это время в секундах, прошедшее с предыдущего вызова функции (использование данного параметра позволяет избегать ошибок, связанных с возможными изменениями FPS).
Попробуем заставить спрайт Icon вращаться: добавим в _process функцию rotate_y для вращения вокруг оси Y. Данная функция принимает значение в радианах, поэтому для начала укажем 0.1.
Посмотрим, что получилось.
Вращается, но слишком уж быстро. Поменяем значение аргумента функции rotate_y, но сделаем это следующим образом:
- введём отдельную константу для значения скорости вращения в градусах;
- передадим данную константу в качестве аргумента функции rotate_y с переводом значения из градусов в радианы.
Выглядит сложно, но на деле всё, что нам нужно - это ввести переменную, значение которой не может изменяться (каламбур):
В комментариях к первой статье этого курса добрый человек посоветовал следующее:
Хотя лучше пиши все с типами или все без типов.
Сейчас в сообществе принято придерживаться строгой типизации и последняя версия движка очень любит ругаться на неявные типы.
Короче вместо var value = 100 лучше писать var value: int = 100 или var value := 100
Как видите, мы так и делаем, определяем тип сразу при объявлении переменной.
Затем передадим данную (не)переменную SPEED в функцию rotate_y, предварительно завернув её во встроенную функцию deg_to_rad для перевода градусов в радианы:
Вот как выглядит наш код в итоге:
И вот как всё это работает:
Это что... всё?
Вообще говоря, я хотел данный урок составить из двух, поскольку в оригинальных роликах много воды, а важного совсем мало, как видите. Однако в этих видеоуроках часть, касающаяся кода, настолько душная (автор канала объясняет буквально каждую мелочь, а что самое плохое - делает такие упрощения, что в принципе обесценивает свои же слова), что мне необходима пауза, чтобы выпить чаю и привести нервы в порядок. Тут ещё на ютубе вышло видео моего любимого малоизвестного автора, и мне нужно его поддержать просмотром... В общем, увидимся.