#4 Godot: 3D Platformer от BornCG. Знакомство с GDScript, создание спрайта

#4 Godot: 3D Platformer от BornCG. Знакомство с GDScript, создание спрайта

Сегодня мы рассмотрим:

  • основы языка программирования GDScript;
  • создание анимированного изображения (спрайта).

Вот как выглядит наш проект на текущий момент.

#4 Godot: 3D Platformer от BornCG. Знакомство с GDScript, создание спрайта

И вот как он играется.

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

Кстати, поработать с GDScript в отрыве от реальности можно тут.

А теперь приступим к созданию нового объекта на нашей сцене. К корневому узлу Level1 добавляем новый дочерний узел Sprite3D, который по сути является простым плоским изображением.

#4 Godot: 3D Platformer от BornCG. Знакомство с GDScript, создание спрайта
Видите спрайт? А он есть
Видите спрайт? А он есть

Обращаем внимание, что в Инспекторе свойство Texture из группы Sprite3D для нашего нового узла является пустым.

#4 Godot: 3D Platformer от BornCG. Знакомство с GDScript, создание спрайта

Очевидно, нам нужно добавить какое-нибудь изображение - пока хотя бы для примера. Обращаем внимание (х2), что в панели файловой системы у нас есть файл icon.svg...

Neuron activation!
Neuron activation!

Перетаскиваем файл icon.svg из панели файловой системы прямиком в свойство Texture.

#4 Godot: 3D Platformer от BornCG. Знакомство с GDScript, создание спрайта
Другое дело
Другое дело

Немного меняем позицию спрайта и смотрим, что получилось.

На нашей сцене теперь имеется плоская поверхность, которая к тому же не является физическим объектом - это просто картинка. Тем не менее, добавили эту картинку мы не просто так, а чтобы попрактиковаться в коде.

Переименовываем узел Sprite3D в, например, Icon и нажимаем на кнопку Прикрепить новый или существующий скрипт к выбранному узлу.

:)
:)
Оставляем все настройки по умолчанию
Оставляем все настройки по умолчанию

Как видите, мы перешли во вкладку работы с кодом (активна кнопка Script в верхней части рабочего пространства), и из двух имеющихся в проекте файлов с кодом выбран новый добавленный.

#4 Godot: 3D Platformer от BornCG. Знакомство с GDScript, создание спрайта

Вот что мы имеем:

extends Sprite3D # Called when the node enters the scene tree for the first time. func _ready() -> void: pass # Replace with function body. # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: pass

Здесь нам интересны две вещи:

  • функция _ready() вызывается, когда узел впервые загружается на сцену, то есть данная функция выполняется только один раз при старте игрового уровня;
  • функция _process(delta) выполняется постоянно в процессе игры, и частота её выполнения равняется частоте кадров в секунду (FPS). Параметр delta — это время в секундах, прошедшее с предыдущего вызова функции (использование данного параметра позволяет избегать ошибок, связанных с возможными изменениями FPS).

Попробуем заставить спрайт Icon вращаться: добавим в _process функцию rotate_y для вращения вокруг оси Y. Данная функция принимает значение в радианах, поэтому для начала укажем 0.1.

func _process(delta: float) -> void: rotate_y(0.1)

Посмотрим, что получилось.

Вращается, но слишком уж быстро. Поменяем значение аргумента функции rotate_y, но сделаем это следующим образом:

  • введём отдельную константу для значения скорости вращения в градусах;
  • передадим данную константу в качестве аргумента функции rotate_y с переводом значения из градусов в радианы.

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

const SPEED: int = 2

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

Хотя лучше пиши все с типами или все без типов.

Сейчас в сообществе принято придерживаться строгой типизации и последняя версия движка очень любит ругаться на неявные типы.

Короче вместо var value = 100 лучше писать var value: int = 100 или var value := 100

Как видите, мы так и делаем, определяем тип сразу при объявлении переменной.

Затем передадим данную (не)переменную SPEED в функцию rotate_y, предварительно завернув её во встроенную функцию deg_to_rad для перевода градусов в радианы:

func _process(delta: float) -> void: rotate_y(deg_to_rad(SPEED))

Вот как выглядит наш код в итоге:

#4 Godot: 3D Platformer от BornCG. Знакомство с GDScript, создание спрайта

И вот как всё это работает:

Превосходно!

Это что... всё?

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

Golden Boy, 1995-1996, и 6 эпизодов всего :(
Golden Boy, 1995-1996, и 6 эпизодов всего :(
2
6 комментариев