Створення першого сценарію

У цьому уроці ви напишете свій перший сценарій, щоб піктограма Godot оберталася по колу за допомогою GDScript. Як ми згадували у вступі, ми припускаємо, що ви володієте основами програмування.

../../_images/scripting_first_script_rotating_godot.gif

Дивись також

Щоб дізнатися більше про GDScript, його ключові слова та синтаксис, перейдіть до Посилання на GDScript.

Налаштування проєкту

Будь ласка, створіть новий проект, щоб почати з чистого аркуша. Ваш проект має містити одну картинку: значок Godot, який ми часто використовуємо для створення прототипів у спільноті.

Нам потрібно створити вузол Sprite, щоб відобразити його в грі. На панелі «Сцена» натисніть кнопку «Інший вузол».

../../_images/scripting_first_script_click_other_node.png

Введіть «Sprite» у рядку пошуку, щоб відфільтрувати вузли і двічі клацніть на Sprite, щоб створити вузол.

../../_images/scripting_first_script_add_sprite_node.png

Ваша вкладка «Сцена» тепер має лише вузол Sprite.

../../_images/scripting_first_script_scene_tree.png

Для відображення вузла Sprite потрібна текстура. У Інспекторі праворуч ви можете побачити, що властивість Texture говорить «[порожньо]». Щоб відобразити піктограму Godot, клацніть і перетягніть файл icon.png із вкладки Файлова система у слот Texture.

../../_images/scripting_first_script_setting_texture.png

Примітка

Ви можете створювати вузли Sprite автоматично, перетягуючи зображення у вікно перегляду.

../../_images/scripting_first_script_dragging_sprite.png

Потім клацніть і перетягніть піктограму у вікні перегляду, щоб відцентрувати її в області перегляду гри.

../../_images/scripting_first_script_centering_sprite.png

Створення нового сценарію

Щоб створити та приєднати новий сценарій до нашого вузла, клацніть правою кнопкою миші на Sprite в панелі сцени та виберіть «Долучити скрипт».

../../_images/scripting_first_script_attach_script.png

The Attach Node Script window appears. It allows you to select the script's language and file path, among other options.

Змініть шаблон із Типовий на Empty, щоб почати з чистого файлу. Залиште інші параметри за замовчуванням і натисніть кнопку Створити, щоб створити сценарій.

../../_images/scripting_first_script_attach_node_script.png

The Script workspace should appear with your new Sprite.gd file open and the following line of code:

extends Sprite

Кожен файл GDScript є неявно класом. Ключове слово extends визначає клас, який успадковує або розширює цей сценарій. У цьому випадку це Sprite, що означає, що наш скрипт отримає доступ до всіх властивостей і функцій вузла Sprite, включаючи класи, які він розширює, наприклад, Node2D, CanvasItem і ``Node` ``.

Примітка

У GDScript, якщо ви пропустите рядок із ключовим словом extends, ваш клас неявно розширить клас Reference, який Godot використовує для керування пам’яттю вашої програми.

Успадковані властивості включають ті, які ви можете побачити в панелі Інспектор, як-от texture нашого вузла.

Примітка

За замовчуванням Інспектор відображає властивості вузла великими літерами розділеними пробілом ("Title Case"). У коді GDScript ці властивості наведені у нижньому регістрі та розділені символом підкреслення ("snake_case").

Ви можете навести курсор на назву будь-якої властивості в Інспекторі, щоб побачити опис та її ідентифікатор у коді.

Hello, world!

Наш скрипт наразі нічого не робить. Давайте змусимо його надрукувати текст "Привіт, світ!" до нижньої панелі виводу, щоб почати.

Додайте наступний код до свого сценарію:

func _init():
    print("Hello, world!")

Давайте розберемо його. Ключове слово func визначає нову функцію під назвою _init. Це спеціальна назва для конструктора нашого класу. Движок викликає _init() для кожного об'єкта або вузла після його створення в пам'яті, якщо ви визначаєте цю функцію.

Примітка

GDScript — мова, заснована на відступах. Початковий відступ табуляції у рядку ``print()``необхідний для роботи коду. Якщо ви пропустите його або зробите не правильний відступ, редактор виділить його червоним кольором і відобразить повідомлення про помилку: "Неочікуваний відступ."

Збережіть сцену, якщо ви ще цього не зробили, потім натисніть F6, щоб запустити її. Подивіться на нижню панель «Вивід», яка розгорнеться. На ній має відображатися "Привіт, світ!"

../../_images/scripting_first_script_print_hello_world.png

Видаліть функцію _init(), щоб у вас залишився лише рядок extends Sprite.

Обертання

Настав час змусити наш вузол рухатися і обертатися. Для цього ми збираємося додати до нашого сценарію дві змінні-члени: швидкість руху в пікселях за секунду і кутову швидкість в радіанах за секунду.

extends Sprite

var speed = 400
var angular_speed = PI

Змінні-члени розташовані у верхній частині скрипту, перед функціями. Кожен екземпляр вузла з приєднаним до нього сценарієм матиме власну копію властивостей speed та angular_speed.

Примітка

Як і в деяких інших рушіях, кути в Godot за замовчуванням працюють у радіанах, але у вас є вбудовані функції та властивості, якщо ви віддаєте перевагу обчислюванню кутів в градусах.

Щоб перемістити нашу іконку, нам потрібно оновити її положення та обертати кожен кадр у ігровому циклі. Ми можемо використовувати віртуальну функцію _process() класу Node. Якщо ви визначите її в будь-якому класі, який розширює клас Node, як-от Sprite, Godot буде викликати функцію кожен кадр і передасть їй аргумент під назвою delta, тобто час, що минув з моменту останнього кадру.

Примітка

Ігри працюють, відтворюючи багато зображень за секунду, кожне з яких називається кадром, і роблять це циклічно. Ми вимірюємо швидкість, з якою гра створює зображення в кадрах за секунду (FPS). Більшість ігор націлені на 60 FPS, хоча ви можете знайти і 30 FPS на повільних мобільних пристроях або від 90 до 240 для ігор віртуальної реальності.

Розробники рушія та ігор роблять усе можливе, щоб оновлювати ігровий світ і відтворювати зображення через постійний проміжок часу, але завжди є невеликі зміни в часі візуалізації кадрів. Ось чому рушій надає нам це значення дельта-часу, завдяки чому наш рух не залежить від частоти кадрів.

У нижній частині скрипту визначте функцію:

func _process(delta):
    rotation += angular_speed * delta

Ключове слово func визначає нову функцію. Після нього ми повинні написати ім’я функції та аргументи, які вона приймає, у дужках. Двокрапка закінчує визначення, а наступні блоки з відступом є вмістом або інструкціями функції.

Примітка

Зверніть увагу, що як _process(), так і _init(), починається з підкреслення. За домовленістю, віртуальні функції Godot, тобто вбудовані функції, які ви можете замінити для зв’язку з рушієм, починаються з підкреслення.

Рядок всередині функції, rotation += angular_speed * delta, збільшує обертання нашого спрайта кожен кадр. Тут rotation є властивістю, успадкованою від класу Node2D, який розширює Sprite. Він контролює обертання нашого вузла і працює з радіанами.

Порада

У редакторі коду ви можете клацнути, утримуючи клавішу ctrl, будь-яку вбудовану властивість або функцію, як-от position, rotation або _process, щоб відкрити відповідну документацію у новій вкладці.

Запустіть сцену, щоб побачити, як значок Godot повертається на місці.

../../_images/scripting_first_script_godot_turning_in_place.gif

Рухатися вперед

Тепер змусимо вузол рухатися. Додайте наступні два рядки до функції _process(), переконавшись, що нові рядки мають відступ так само, як і попередній.

var velocity = Vector2.UP.rotated(rotation) * speed

position += velocity * delta

Як ми вже бачили, ключове слово var визначає нову змінну. Якщо розмістити його у верхній частині сценарію, він визначає властивість класу. Усередині функції він визначає локальну змінну: вона існує лише в межах функції.

Ми визначаємо локальну змінну з назвою velocity, двовимірний вектор, що представляє і напрямок, і швидкість. Щоб змусити вузол рухатися вперед, ми починаємо з константи Vector2.UP класу Vector2, вектора, спрямованого вгору, і повертаємо його, викликаючи метод Vector2.rotated(). Цей вираз, Vector2.UP.rotated(rotation), є вектором, спрямованим вперед відносно нашої піктограми. Помножений на нашу властивість speed, дає нам швидкість, яку ми можемо використовувати для переміщення вузла вперед.

Ми додаємо velocity * delta до position вузла, щоб перемістити його. Сама позиція має тип Vector2, вбудований у Godot тип , що представляє 2D вектор.

Запустіть сцену, щоб побачити, як голова Godot рухається по колу.

../../_images/scripting_first_script_rotating_godot.gif

Примітка

Переміщення такого вузла не враховує зіткнення зі стінами або підлогою. У Ваша перша 2D гра ви дізнаєтеся про інший підхід до рухомих об’єктів під час виявлення зіткнень.

Our node currently moves by itself. In the next part Обробка вводу гравця, we'll use player input to control it.

Complete script

Ось повний файл Sprite.gd для порівняння.

extends Sprite

var speed = 400
var angular_speed = PI


func _process(delta):
    rotation += angular_speed * delta

    var velocity = Vector2.UP.rotated(rotation) * speed

    position += velocity * delta