close

Рабочая программа «Разработка компьютерных игр на движке Godot Engine» Знакомство с Godot Engine и Проект «Pong». Часть 4

Рабочая программа «Разработка компьютерных игр на движке Godot Engine»

Знакомство с Godot Engine и Проект «Pong»



Оглавление разделов
1. Что же такое Godot. Установка программы
2. Знакомство с Godot Engine
3. Разработка игры Pong. Игрок

4. Программирование в Godot
5. Создание уровня
6. Создание противника

4.          Программирование в Godot 

Язык программирования, который мы собираемся использовать в Godot называется GDScript, он очень похож на язык python, он легок в освоение и имеет схожую структуру. В годот скрипт всегда связан с узлом, вы можете брать узел, все его атрибуты и создавать новые возможности, и каждый узел может быть расширен по-разному.

Вернемся к нашему игроку, и создадим новый скрипт, который будет закреплен за узлом «KinematicBody2D». Выберете узел «Player» и наведите на иконку с холстом и плюсиком, там высветиться подсказка.

Нажмите на иконку.

У вас откроется окошко с настройками скрипта, давайте их разберем.

Первая опция «Язык» здесь предлагается на выбор несколько языков. Один из низ относиться к визуальному программированию «VisualScript», особый вид визуального программирование путем перетаскиванием блоков и связей между ними. Но мы будем использовать язык по умолчанию «GDScript»

Каждый узел наследуется от другого узла, в нашем случая наш скрипт будет наследоваться от узла «KinematicBody2D», а он в свою очередь наследуется с такого списка: PhysicsBody2D < CollisionObject2D < Node2D < CanvasItem < Node < Object

Шаблон отвечает за наполняемость скрипта, если выставлено по умолчанию, то вы увидите скрипт с комментариями частично указывающий как использовать некоторые элементы в скрипте

Шаблон по умолчанию

Если выберете «Empty» то кроме наследование класса больше не увидите ничего. А если выбрать «No Comments», то будет скрипт выглядеть так же как по умолчанию, только без комментарий.

Скрипт будет сохраняться отдельным файлов в формате «gd». А куда именно будет сохраняться выбирать вам, либо он изначально укажет название узла, и поместит туда скрипт где сохранена сцена, либо вы можете сами изменить куда помещать скрипт через иконку папки.

Что же давайте все же создадим наш скрипт. Настройки скрипта будут такими.

Нажмите кнопку создать.

После этого нас перекинет на текстовый редактор самого Годота, обратите внимание сверху, мы из режима 2D перешли на режим Script. Вы можете снова переключаться между режимами если кликните на нужный режим.

Переменная – ячейка памяти в которой вы можете хранить различные значения или даже объекты, будь то целые числа, строки (обыкновенный текст, завернутый в двойные кавычки) или вещественные числа (дробные числа), или даже классы, узлы.

Объявление переменной в Годот происходит через оператор «var», таким образ мы объявляем Годоту о том, что выделяем память под переменную которую собираемся использовать.

Первая строчка кода говорит о наследование из узла (класса) «KinematicBody2D».

 

Если вы видите знак «#», а после какой-либо текст или команду, знайте это комментарий. Комментарии предназначены для разработчиков, это не большие сообщения которая игнорирует программа, но за то показывает разработчику какую-либо информацию. Какая бы команда не была за комментарием, она никогда не исполнится. Вы можете создавать свои пометки, свои комментарии, чтобы указать какую-либо напоминающею информацию.

 

А теперь давайте удалим все, кроме первой строчки и объявим переменную с названием «Speed» (Скорость) и присвоим ей значение 400

Названием переменное выдуманное, а целое (не дробное) число подобранно случайно.

 

И чтобы наш код заработал мы должны использовать функции. Но что же такое функция?

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

 

Мы можем использовать встроенные функции или собственные. Если мы создаем собственные функции (созданные нами), мы должны их вызвать во встроенных функциях чтобы они заработали. Конечно для этого мы должны описать встроенные функции.

 

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

К примеру, у нас есть встроенная функция «ready» которая всегда будет срабатывать если сцена готова.

Функции обновлении. В годот существуют 2 функции похожие друг на друга, но имеющие отличие.

_process _physics_process
Используйте _process, когда вам нужна разница между кадрами, зависящая от частоты кадров. Если код, обновляющий данные объекта, должен обновляться как можно чаще, это правильное место. Здесь часто выполняются повторяющиеся логические проверки и кэширование данных, но все сводится к частоте, с которой нужно обновлять оценки. Вызывается перед каждым шагом расчёта физики с постоянной частотой кадров (по умолчанию 60 раз в секунду). Используйте _physics_process, когда вам нужна разница во времени между кадрами, не зависящая от частоты кадров. Если код требует постоянных обновлений с течением времени, независимо от того, насколько быстро или медленно идёт время, это правильное место. Здесь должны выполняться повторяющиеся кинематические операции и операции преобразования объектов.

Теперь напишем встроенную функцию _physics_process, будем использовать её.

С новой строки вписываем ключевое слово func а после начнем писать _physics_process. Как только мы будем прописывать название функции Годот подскажет какую функцию мы собираемся использовать, даже не написав название функции до конца, нажмите кнопку Enter на клавиатуре, чтобы сразу вписать выбранный вариант.

Функция состоит не только от ключевого слова func и название функции, в скобках иногда может находиться текст – это аргумент. Аргументы это передаваемые значение или объекты в функции из вне. Аргументы не всегда могут присутствовать функциях. И заканчивается первая строчка функцией двоеточием.

Когда мы выбирали подсказу в скобках прописался аргумент delta, она является числом с плавающие запитой, равным времени, прошедшему в секундах с момента последнего шага. При использовании частоты обновления физики по умолчанию 60 Гц она обычно будет равна 0,01666... (но не всегда).

Теперь наша строчка горит красным фоном, это говорит о том, что мы еще не создали функцию, то есть она пустая, нету содержимого. Давайте это исправим.

Нажмите Enter (курсор должен находиться на конце строчки функции), Годот переведет активный курсор на новую строку и сделает отступ. Это очень важный отступ, которые сообщает Годоту что любая команда, находящаяся ниже функции и имеющая отступ принадлежит этой функции. Подобный отступ сравним с языком python. И если вы создадите новые строки не имеющие отступы, это будет означать что эти команды не будут принадлежать текущий функции.

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

  1. Мы должны определить ввод игрока. Момент, когда игрок нажимает клавишу для перемещения ракетки на игровом поле.
  2. Мы храним ввод игрока.
  3. Здесь мы применяем наш хранимый ввод для ракетки чтобы перемещать его по полю.

Начнем с первого шага (внезапно), но для начала нам понадобиться переменная для хранения ввода и мы будем использовать еще одну вещь Годота Vector2.

Vector2 - Двухэлементная структура, которую можно использовать для представления позиций в 2D-пространстве или любой другой паре числовых значений. Иными словами, это массив имеющий координаты X и Y.

Vector2 = [x, y]

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

Объявим переменную и назовем её «velocity», вызовем наш вектор Vector2. И когда мы поставим точку после вектора, Годот снова даст нам подсказки.

Но мы впишем аргумент «ZERO»

Аргумент «ZERO» в векторе указывает нам что направление не задано. Она выставляет значение вектора равная = [0, 0]

Шаг номер два: ввод пользователя с клавиатуры. Мы вызываем ключевое слово Input (отвечает за ввод с клавиатуры) и после через точку обращаемся к методу «is_action_pressed()» который отвечает за нажатие клавиши, которая назначена в атрибутах. Этот атрибут является ключом, заранее прописанной строкой, в нашем случая «ui_up», которая указывает на клавишу стрелки вверх. 

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

Но сейчас это не имеет особого толку, давайте завернем нашу конструкцию в условие

Условие работает, как и другие условия в других языках программирования. Дословно можно сказать так: Если ввод кнопки вверх нажата, то мы выполняем следующее выражение которое будет под условием.

Не забудьте поставить if и двоеточие в конце условия, нажмите enter. Теперь курсор совершит снова переход вниз и снова сделает отступ, символизирующие будущие содержимое условию. Отступы важны!

Шаг третий, будем перемещать нашу ракетку с помощью значений. Вызовем нашу переменную «velocity», так как мы её уже объявляли, она находиться в памяти, теперь нам не нужно добавлять ключевое слова «var» чтобы использовать переменную.

Так как в нашей переменной храниться вектор мы можем использовать одно из значений вектора «y» вызывая его через точку. Мы собираемся вычитать единицу с этого значения.

Подобное выражение на 8 строчке, это сокращение от этого выражения.

Иными словами, мы вычитаем значение «y» на единицу и снова присваиваем переменной «velocity». Просто сокращенное выражение читается быстрее.

Теперь скопируем строчку 7 и 8, с новой строки вставим нашу копию и подправим её. Теперь нам надо проверять нажата ли клавиша вниз, а также изменим значение «velocity», будем прибавлять единицу.

Теперь давайте поговорим о системе координат. В школе вы изучаете декартовую систему координат, у вас есть две оси, ось абсцисс и ось ординат. Есть начало координат. Если смотреть от начала координат по оси абсцисса в правую сторону, по оси Х то числа будут положительные, иначе отрицательная. Ось ординат, он же ось Y от начала координат вверх идут положительные числа, а если смотреть вниз от начала координат, то отрицательные числа

В Godot же начала координат идет от верхнего левого угла. По оси Х схожа, как и в декартовой системе, а вот ось Y отличается. От начала координат вниз ось Y увеличивается положительно, а вверх отрицательно.

Поэтому, когда мы хотим переместить ракетку вниз мы прибавляем положение объекта по оси Y, а если хотим поднять вычитаем. Это немного не привычно, но начала координат системы Годота находиться в левом верхнем углу игрового поля.

А теперь мы применим наше вычисление перемещение игроку. Используем метод «move_and_slide()» который перемещает тело вдоль вектора. Если тело сталкивается с другим телом, оно будет скользить вдоль другого тела, а не сразу останавливаться. Если другое тело является KinematicBody2D или RigidBody2D, на него также будет влиять движение другого тела. Вы можете использовать это для создания движущихся и вращающихся платформ или для того, чтобы узлы толкали другие узлы. Поместим туда нашу переменную velocity.

А теперь сохраните сцену и запустите её через F6. Попробуйте перемещать нашу ракетку за счет клавиш вверх или вниз. Поначалу вам может показаться что ничего не происходит, но присмотритесь, ракетка движется, правда крайне медленно, а все потому что мы лишь направляем ракетку, но не применяем к неё скорость. Умножим на направление нашу скорость прямо в атрибутах метода.

Снова сохраните и запустите текущую сцену F6. И наша ракетка будет двигаться намного шустрее.

Категория: Разработка игр на Godot Engine | Добавил: Doctor_Bug (16.09.2022)
Просмотров: 66 | Теги: games, Pong, game, Godot | Рейтинг: 5.0/1
Всего комментариев: 0
avatar