3. Управление тележкой. GDScript
В прошлом проекте «Pong» мы использовали готовы ключи для нажатий клавиш, в этом же проекте мы сможем управлять стрелками на клавиатуре, и клавишами «A» и «D» чтобы перемещать нашу тележку влево или вправо.
Зайдем в настройки проекта.

Перейдем к «Списку действий»

Добро пожаловать в обитель все кнопочек, рычажков и сенсоров. Здесь вы можете настроить или создать собственный ключ которому будете привязывать те или иные клавиши, клавиатуры, мыши, джойстика или даже сенсорных нажатий.
Спустите список до ключей под названием «ui_left» и «ui_right». И вы увидите, что здесь уже есть первоначальные настройки и что к ним привязаны клавише стрелки влево и вправо, а также кнопки геймпада. С помощью плюсика мы добавим еще пару клавиш, в «ui_left» мы добавим клавишу «A» (английскую), а в «ui_right» добавим клавишу «D».

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

А после вам нужно будет нажать на соответствующую кнопку в клавиатуре.

И подтвердить действия кнопкой «ок».
Проделайте тоже самое только с ключом «ui_right». У вас должно получиться так:

Здесь высвечиваются наши клавиши.
Вернемся к нашему игроку, теперь пропишем его механизм перемещения под управлением игрока. Как мы помним для этих целей нам понадобиться скрипт, прикрепленный к игроку. Выберете узел «Player» и прикрепите скрипт.
Только давайте сделаем пустой скрипт, в шаблоне скрипта выберете опцию «Empty», это позволит загрузить чистый скрипт без комментариев и заранее прописанной встроенной функции «_ready». Название скрипта пускай останется прежнем, тот вариант что предложил сам Годот.

У нас будет переменная скорости, в которую мы поместим вектор х и у. Вспоминаем вектор2 из прошлого проекта. Объявим переменную «velocity» туда поместим наш вектор «0» он же Vector2.ZERO. Эта переменная будет принимать численное значение и передвигать нашу тележку.

Далее нам понадобиться встроенная функция «_physics_process» которая будет обновлять координаты нашей тележки. Эта функция будет вызываться 60 кадров в секунду, при условии, если мы это пропишем. Снова зайдем в наши настройки проекта, найдите настройки «Debug», далее в параметрах «Settings» ищем параметр «Force Fps» выставите значение 60. Теперь игра у нас будет просчитывать 60 кадров в секунду.

Вернемся к нашему не законченному скрипту.

А вот теперь будем прописывать условия по нажатию клавиш игрока. Модуль Input отвечает за ввод пользователя. А метод «is_action_pressed» отвечает за нажатие кнопки. Прописывая метод Годот будет давать подсказки виде ключей, тем самых ключей которые мы настраивали в настройке проекта – списке действий. Выберете ключ «ui_left» и завершите условие двоеточием.


Заглушка pass нужен для того чтобы годот не ругался при отсутствие кода в условиях или функция и т.д.
Так как мы поместили в переменную скорости «velocity» вектор, мы можем обращаться к Х или У этого вектора. Мы будем двигаться влево при нажатие клавиш стрелки влево или кнопки «А» или при нажатие на клавишу влево на геймпаде. А так как слева направо начинается отсчет координат по оси Х, то мы и будем отнимать минус 500 единиц, дабы двигаться в левую сторону нашу тележку. Давайте сразу пропишем условие и на нажатие правую сторону клавиш, и будем прибавлять на этот раз 500 единиц.

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

Что же, давайте сохраним сцену и запустим её через кнопку F6

Упс… ничего не потеряли? Присмотритесь в левый верхний угол, там наша тележка. Перейдите к сцене игрока нажав кнопку 2D верху

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

А после переместите тележку в центр игрового поля левой кнопкой мыши. Не забываем, что в рабочем пространстве указаны границы экрана

Запустите игру и попробуйте нажать клавиши влево или вправо, или клавиши «А» или «D»

Я нажал влево, и тележка рванула без установочно в левую сторону. Если нажать вправо тележка логично отправить в правую сторону, так же без остановки. Сможете понять почему так происходит? Сравните код в предыдущим проектом по понгу и вы поймете, если будете внимательны.
Сейчас ускорение нашему вектору задают магические числа 500, которые через месяц могут и позабыться, давайте обернем их в переменную и назовём «acceleration» (ускорение), не забудьте объявить переменную.

Так то лучше, избавились от магических чисел.
Мы будем создавать тормозящий момент тележки. Чтобы после тонко настроить нашу движущую машину уби…тележку =)
Создадим еще одну переменную «friction» (Трение), она будет отвечать за трение и сбавлять скорость после отпускание кнопки управления. Дадим ей 200 единиц

Далее впишем такую конструкцию, а после разберем её

Метод относящийся к вектору move_toward будет смещать наш вектор используя второй параметр (в нашем случаи это friction) до значения первого параметра, но не превышая его. После мы перезаписываем значение вектора. Ниже представлен пример с меньшем трением, и как будет действовать если игрок будет двигаться вправо или влево, или если значения вектора по х будет положительным или отрицательным.

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

Функция get_node равносильно знаку «$», можно обращаться к узлу и таким образом. Создадим переменную «animation» которая будет хранить в себе узел анимации нашей тележки. Объявим переменную, вызовем встроенную функцию «_ready». Обратимся к узлу анимации «AnimatedSprite»

Далее создадим условие если переменная velocity не будет ровна 0, то мы запускаем анимацию спрайта, иначе нет. Условие поместим после нажатие клавиш

Чтобы разглядеть анимацию давайте сбавим наше ускорение до 200 а трение до 20. Оставим временно пока такие параметры. Запустите игру через F6 и по управляйте тележкой влево или вправо, вы увидите анимацию тележки и эффект тормозящего пути.


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