1. Основы GDScript на простых примерах: переменные, условия, циклы и функции
Переменные, условия, циклы и функции: пишем первые скрипты на GDScript
Представь, что ты приходишь в ресторан и заказываешь бургер. Официант записывает твой заказ (это переменная), проверяет, есть ли нужные ингредиенты на кухне (это условие), готовит бургер, повторяя одинаковые действия для каждой котлеты (это цикл), и в конце подаёт готовое блюдо — результат чёткой последовательности шагов (это функция). Всё программирование, включая GDScript, работает точно так же. Разница лишь в том, что вместо бургеров мы будем управлять монстрами, фонариками и дверями в нашем хорроре.
Переменные — коробки с наклейками
Переменная — это именованная ячейка памяти, куда ты кладёшь какое-то значение. Представь шкаф с выдвижными ящиками. На каждом ящике наклейка: «Здоровье игрока», «Количество патронов», «Имя монстра». Внутри ящика лежит конкретное значение: 100, 12, «Тень».
В GDScript переменная объявляется через ключевое слово var:
Здесь мы создали четыре переменные разных типов:
health — целое число (int), здоровье игрокаplayer_name — строка (String), имя персонажаis_alive — логическое значение (bool), жив ли персонажspeed — дробное число (float), скорость движенияМожно явно указывать тип переменной — это считается хорошей практикой, потому что помогает движку работать быстрее и предотвращает ошибки:
Представь разницу между явным и неявным типом так: если ты кладёшь в ящик с наклейкой «Только цифры» кусок пиццы — это ошибка. Явное указание типа работает как замок на ящике: ты не положишь туда ничего лишнего.
Ещё важная идея — константа. Это переменная, которую нельзя изменить после создания. Объявляется через const:
Константа — как табличка «Не трогать!» на двери серверной. Значение зафиксировано раз и навсегда.
Условия — если... то...
Условие — это развилка на дороге. Ты стоишь перед перекрёстком: если светофор зелёный — идёшь, если красный — стоишь. В коде это выглядит так:
Обрати внимание на два важных момента:
== (два знака равно), а не = (один знак). Один = используется только для присваивания значения переменной.if, elif, else отделяются отступами (табуляцией или пробелами), а не фигурными скобками, как в C++ или JavaScript. Это работает точно так же, как в Python.Условия можно вкладывать друг в друга, как матрёшка:
Также в GDScript есть удобная конструкция для проверки нескольких условий одновременно через операторы and (и), or (или), not (не):
Циклы — повторяй, пока не надоест
Цикл — это конвейер на заводе. Один и тот же набор действий выполняется многократно, пока не закончатся детали или конвейер не остановят.
В GDScript есть два основных типа циклов: for и while.
Цикл for — перебирает элементы одного за другим. Представь, что ты перебираешь карточки в каталоге — берёшь одну, смотришь, кладёшь обратно, берёшь следующую:
Функция range(5) создаёт последовательность чисел от 0 до 4. Если нужен другой диапазон:
Цикл for удобен для работы с массивами (списками). Например, если у нас есть массив предметов в инвентаре:
Цикл while — работает, пока условие истинно. Это как кипятильник: он греет воду, пока температура не достигнет 100°C:
Будь осторожен с while — если условие никогда не станет ложным, цикл будет работать бесконечно и «повесит» игру. Это как забыть выключить газ: вода выкипит, кастрюля сгорит, а пламя продолжит гореть.
Функции — рецепты из кулинарной книги
Функция — это именованный набор инструкций, который можно вызвать в любой момент. Представь рецепт борща: в нём записана чёткая последовательность шагов. Тебе не нужно каждый раз заново придумывать, как варить борщ — ты просто открываешь рецепт и следуешь ему.
В GDScript функция объявляется через func:
Разберём по частям:
func — ключевое слово, говорящее движку: «начинается функция»take_damage — имя функции (название рецепта)(amount: int) — параметр: входные данные, которые функция получает извне (сколько урона нанести)-> void — тип возвращаемого значения. void означает, что функция ничего не возвращает (просто выполняет действие)Если функция должна вернуть результат, указываем конкретный тип:
Эта функция принимает базовый урон и множитель, вычисляет итоговый урон и возвращает его через return. Мы можем использовать результат так:
Функции с параметрами по умолчанию позволяют вызывать их с разным количеством аргументов:
Встроенные функции Godot — жизненный цикл объекта
Godot автоматически вызывает определённые функции в конкретные моменты жизни объекта. Две самые важные:
_ready() — вызывается один раз, когда объект появляется на сцене. Это как первый день на новой работе: ты знакомишься с окружением, расставляешь вещи на столе._process(delta) — вызывается каждый кадр (примерно 60 раз в секунду). Это как сердцебиение игры — именно здесь происходит постоянное обновление: движение, анимация, проверка условий.Параметр delta критически важен для плавного движения. Если ты просто прибавляешь speed к позиции каждый кадр, то на мощном ПК (120 FPS) объект будет двигаться вдвое быстрее, чем на слабом ноутбуке (60 FPS). Умножая скорость на delta, ты компенсируешь это: расстояние за кадр становится одинаковым независимо от частоты кадров.
Переменные уровня узла — видимость и доступ
В Godot переменные, объявленные в скрипте, доступны только внутри этого скрипта. Но иногда нужно, чтобы один объект знал о другом. Для этого используется ссылка на узел через символ Flashlight # Получаем ссылку на дочерний узел
flashlight.visible = false # Выключаем фонарик
`
Путь Room/Door/Handle`.
С этими четырьмя китами — переменными, условиями, циклами и функциями — ты готов писать реальные игровые механики. В следующей статье мы применим эти знания, чтобы заставить объекты сталкиваться, подниматься и летать по комнате.