Основы создания 2D персонажа в Godot. Часть 1: компилирование игрового движка, создание проекта и анимация покоя героя

Пару дней назад увидел статью о публикации исходного кода под свободной лицензией MIT игрового движка Godot и сразу решил поковыряться в нём.
Оказалось не всё так сложно, скорее забавно. В своей первой публикации хотелось бы рассказать о первых шагах на пути к созданию игрового платформера, и всех подводных камнях, о которые я чуть было не переломал пальцы за эти дни.



Если это кому-то интересно, добро пожаловать под Хабракат!

Встречаем: компилирование и установка godot на GNU/Linux x86, создание простейшей сцены и анимированного персонажа


Сразу определимся, чтобы не было недопонимания:
1) На написание статьи меня сподвиг image Charoplet со своим циклом статей «2D персонаж в Unity 3D». Спасибо ему за это, творческих успехов и новых публикаций.
2) Опять же, для наглядности взял (без спроса) текстуры (персонажа) из его уроков. Надеюсь, меня за это простят.
3) На борту имею только GNU/Linux, x86 и amd64 соответственно. Под другие ОС достаточно скачать бинарные файлы с сайта создателей. Так как под amd64 всё уже есть, а под x86 предвидится в ближайшем будущем (автор обещал скомпилировать бинарные файлы как только сможет), я и решил что для 32-битных систем статья будет более актуальна и интересна.

Компиляция

Устанавливаем зависимости, если ещё нет в системе (Если что-то не получается, информация устарела, посмотрите на сайте разработчиков):

GCC or LLVM
Python 2.7+ (3.0 ещё не тестировался).
SCons build system.
X11 and MESA development Libraries
ALSA development libraries
Freetype
pkg-config
Пользователям Ubuntu:
apt-get install git scons pkg-config libx11-dev libxcursor-dev build-essential libasound2-dev libfreetype6-dev libglu-dev


Клонирование исходных кодов:
git clone https://github.com/okamstudio/godot.git


Само компилирование:
cd ./godot
scons bin/godot


scons поддерживает параллельную компиляцию. Достаточно добавить опцию -j с аргументом, указывающим на количество потоков, например
scons -j 4  bin/godot
У меня быстрее всего получалось когда число потоков == числу ядер.

Можно сходить и приготовить чашечку чая. Компилирование — процесс не быстрый.

Чай приготовили, компиляция ещё идёт? Тогда можно сходить на сайт издателя и почитать документацию, скачать Демо и примеры, а так-же Шаблоны экспорта проектов под нужные операционные системы.

Первый запуск, создание проекта

В директории /bin появился бинарный файл godot. Достаточно просто запустить его.
Перед нами сразу же появляется диалоговое с проектами. Так как мы запустили в первый раз, оно будет пустым.

Давайте создадим свой первый проект.

New Project -> Project Path — соответственно директория, в которой он и будет находиться; Project Name — его название.
Не долго думая выбираем место назначения, называем test, клацаем кнопочку Edit, и созданный проект вылетает с segmentation fault.

Сначала я думал что у меня руки кривые. Пересобрал из git, запускаю — опять двадцать пять. Собрал на другой машине — всё заработало! На своей — нет. И тут до меня допёрло! Товарищи! Программа не понимает кириллицу! В общем переместил я всё в другой каталог, и всё заработало и на моей машине. Что ж, впредь будем осторожнее.

Ну вот и главное окно программы.



Для начала давайте создадим новую сцену. Сцена — это эпизод игры. Это может быть целый уровень. Заставка. Анимация персонажа. Задний план. Godot — программа редактирования сцен. Мы сегодня не будем углубляться в создание полнофункциональной игровой сцены, а просто создадим персонажа.

Создание игрового персонажа

Первое что надо сделать — это добыть спрайты. Нарисовать/скачать/украсть. Я пожалуй возьму из урока про Unity3D. Спрайты от image Charoplet.

Качаем Idle.png.
Импортируем в Godot:

image

Указать какое изображение(я) куда импортируем



Указать степень сжатия

image

И нажать «Import». В Wiki есть более подробная информация об импорте текстур на английском. Рекомендую к прочтению.

Ну а мы довольные результатом пробуем создать персонажа.

Сцена персонажа

В верхнем правом углу в окошке Scene нажимаем на единственную активную кнопку «Add/Create a new Node», или сочетанием клавиш Ctrl+A создаём «Ноду». Я думаю самый близкий перевод — шестерня, но звучит не красиво. Пусть будет материал? Документ? Или так и оставить, — «Нода»? Буду рад комментариям.

В поиске «Search» вводим «Rigid», и «Node» отсортируются по названиям. Выбираем RigidBody2D.
Настраиваем параметры в меню Inspector ниже:
Mode: Character
Mass: 3
Friction: 0
Custom Integrato:


Так. Хорошо идём! Теперь натягиваем спрайт:
Опять Ctrl+A, Sprite -> Выбираем Sprite. Не AnimatedSprite, а просто Sprite.
Идём в «Настройки» (Inspector — Контроль?), нажимаем на Texture в самом верху, -> Load. Выбираем уже импортированную текстуру Idle.tex.



Да, она появилась! Теперь нам надо указать, что у нас тут аж целых 8 фреймов (Правда сами фреймы считаются с нуля, их количество считаем с единицы, привыкайте). Параметр Hframes, — Горизонтальные фреймы, ставим равным 8. И что мы видим?



На первом же (который нулевой) фрейме виден хвост капитана из следующего! Это возмутительно! Да что эти OKAM Studio о себе возомнили?! Даже количество кадров в раскадровке нормально посчитать не могут! Как они могут такие программы писать?!

Да? Промелькнула мысль? Нет, разработчики не виноваты. Виноваты мы. Поленились нарисовать свои спрайты. Взяли чужие — вот и расплата.
Персонаж на спрайте расположен криво. Будем править.

… Спустя 10 минут…

В GIMP'е оказывается делать/изменять/править спрайты не так уж и трудно. Выставляем сетку нужного размера (120 на 120 пикселей). И распихиваем кадры по местам. Готово. Скачать исходные файлы можно тут. Готовая текстура выглядит так:



Да, я склеил все анимации в одну картинку. Чтобы было проще работать дальше. Когда мы будем делать прыжки и бег/ходьбу.

Ок, перезаливаем. Указываем Vframes = 4; Hframes = 8

Наводим на RigidBody2D и переименовываем его в player. Так будет понятнее, не правда ли?

Ctrl+A — создаем «Node» «AnimationPlayer» и сразу же «Camera2D» чтобы не возвращаться. Переименовываем AnimationPlayer в anim, а Camera2D просто в camera. Так дальше будет проще. С камерой я думаю сразу догадались что делать. Больше пока её трогать не будем.

Самое время создавать анимацию! Делать это проще некуда! Выбираем anim, внизу слева появляется меню анимации.
Создадим анимацию. Слева внизу есть кнопка «Create new animation in player». Жмякаем. Называем idle.
Нажимаем на карандаш правее, и вот оно, меню редактора анимации.

Ставим Len(s) — длину анимации 1,1 (секунды), а Step(s) — шаг анимации, 0,15.
Выбираем опять на Sprite в окне Scene вверху справа.

Смотрим на Inspector — ищем переменную Frame. Она должна равняться нулю. Справа нарисован ключик. Нажимаем на него. Нам предлагают создать новую линию анимации «frame» для данного спрайта. Соглашаемся (Create).
Теперь всё просто. Нажимаем Ctrl + Right, выбираем следующую анимацию — нажимаем на ключик. И так далее. Всего должно получиться 8 синих точек, 8 кадров анимации. После этого можно нажать на плеере на play, и посмотреть что у нас получилось. Да, не забудьте зациклить анимацию. (Кнопка Enable/Disable looping in animation).



Сохраняем сцену (Scene -> Save, назвав player.xml).

Так, 30% сделали. Теперь самое интересное.

Будем варить! кодить!

Scene -> player -> Inspector -> Script. Успеваете за мной? На скриншоте выше нарисовано куда идти. Выбираем там New GDScript.

Переключаемся на вкладку скрипты.



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

extends RigidBody2D #объявляем класс

var anim=""  #Объявляем переменную анимации

func _integrate_forces(s):   #Начинаем функцию

	var new_anim=anim #Объявляем переменную смены анимации (понадобится в будущем, когда будем использовать разные анимации)
	new_anim="idle" #присваиваем анимацию покоя

	if (new_anim!=anim): ##Сама смена анимации
		anim=new_anim
		get_node("anim").play(anim)

Ну вот, а вы боялись.
Как и обещал:
extends RigidBody2D

var anim=""

func _integrate_forces(s):

var new_anim=anim
new_anim=«idle»

if (new_anim!=anim):
anim=new_anim
get_node(«anim»).play(anim)

Не забываем сохранить как player.gd.

Так. В принципе почти всё готово. Осталось самое главное:

Создание сцены

Не забываем сохранить сцену с персонажем. И создаём новую. Благо уже умеем.

Для начала создаём пустую «Node» — назовём её Scene.
Теперь к ней привяжем нашего игрока. Нажимаем на «плюс» и выбираем нашего только что созданного player.xml.

Так. Ну и запуск.

image

Упс!

image

Сохраняем нашу сцену как scene.xml. И запускаем ещё раз. Если всё сделали правильно, то увидите потрясающую анимацию нашего Капитана!

Небольшое видео результата с бонусными задниками и землей под ногами:



Ну и в заключение. Как я писал выше, в ОС GNU/linux x86 на данный момент проект экспортировать нельзя. Авторы программы уведомлены. В скором будущем обещали решить эту проблему и скомпилировать не только бинарники для x86, но и Шаблоны экспорта. Также можете протестировать экспорт на другие ОС.

Ну а я, если получится, надеюсь продолжить цикл статей о создании 2D, а в будущем возможно и 3D игр на этом замечательном движке. Приятной пятницы, с Днём Компьютерщика, до скорых встреч!
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 23

    +3
    Этот адмиральский кот — он как хелловорлд в открытом игрострое чтоли?
    Просто недавна его же видел в статьях про Unity.
      +1
      Кот, кстати, из платформера Claw от фирмы Monolith (которая среди всего прочего сотворила офигенский Blood).

      Но почему его именно стали выбирать — не знаю. Может потому что много кадров? Если брать какой-нибудь Doom или Dangerous Dave, там всего 3-5 кадров анимации на почти любое действие.
        +1
        Может потому что много кадров?

        Есть и больше кадров в шитах,
        например
        image
        :
      0
      Фигасе какую вы игру вспомнили, вроде Капитан Коготь называлась…
        0
        как по ощущениям, если сравнивать с Unity3d?
          +4
          Очень хороший и правильный вопрос.
          Я хотел отдельно в последствии создать небольшой флешбек в одной из статей, рассказав про ощущения от использования движка.
          Для начала скажу что очень мало документации. На данный момент это большой минус.
          Второе, что не нравится — отсутствие на данный момент каких-то дополнительных модулей или плагинов. Но авторы утверждают, что в скором времени появятся. И не будет особых проблем добавлять какие-то дополнительные отдельные модули.
          Движок не локализован, и боится кириллицы. Но это не отменяет того факта, что изготовляемое приложение может быть локализовано почти на любой язык мира.
          Так, я ещё не ответил на вопрос… В самом начале было очень непривычно. И непонятно. Абсолютно дикий интерфейс, понятный только разработчикам. Через полчаса я понял, что такой минимализм — очень даже соответствует движку. Есть недоработки. Их много. На гитхабе с каждым часом добавляются всё новые коммиты. Очень переживаю и слежу за разработкой.
          На следующий день использования понял что первоначальное мнение как обычно было ошибочным.
          С Unity3D я работал не так много. По сравнению с ним сейчас Godot — это что-то маленькое, страшненькое. Но в то же время лёгкое и приятное.

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

          Никто случайно еще не пытался разобратся как пишутся расширения и как происходит сборка проектов, что вообще такое export_templates и как они
          создаются?
            0
            Скомпилировать можно через тот же scons:

            debug tool:

            scons bin/godot target=release_debug tools=no

            release tool:

            scons bin/godot_rel target=release tools=no

            Нет, ещё не разбирал. Да и не смогу пока в силу отсутствия нужных знаний. Буду рад если кто-либо посмотрит и расскажет.
              0
              один из авторов движка написал, что для разработки использует qtcreator и чтобы он подцепил сборку просто создается makefile
              примерно такого содержания:
              all:
              /usr/local/bin/scons -j 4 bin/godot_osx

              clean:
              /usr/local/bin/scons -c
                0
                но пока не очень понятно как отлаживать на устройствах
                0
                по поводу расширений пока получил такую инфу
                в директории modules лежит расширение которое используется в движке gridmap — можно изучать как пример;
                в директории plugins скриптовые расширения
              0
              На Linux Mint Lisa не запускается:

              ERROR: initialize: Condition ' !glXCreateContextAttribsARB ' is true. returned: ERR_UNCONFIGURED
                 At: platform/x11/context_gl_x11.cpp:85.
              ERROR: set_custom_property_info: Condition ' !props.has(p_prop) ' is true.
                 At: core/globals.cpp:1317.
              ERROR: initialize: Condition ' x11_window==0 ' is true.
                 At: platform/x11/os_x11.cpp:185.
              Ошибка сегментирования
              
                0
                Я думаю ответ пользователя alrusdi для архитектуры amd64 можно найти в предыдущей статье от alizar.
                  0
                  К сожалению, криллицы нет, файл не запакован.
                    0
                    Прошу прощения, не сразу заметил что это был Ваш комментарий.
                    Давайте по порядку.
                    Linux Mint Lisa?
                    разрядность как я понял… amd64?
                    Скачали бинарные файлы Godot с сайта? Не пробовали скомпилировать из исходников? Все ли зависимости удовлетворили?
                    Ну и как ответите про разрядность, попробую установить в виртуальной коробке и протестировать вживую так сказать.
                      0
                      Все собрано из исходников (бинарникам не хватает новой libc). Разрядность amd64.
                0
                Редактор — это, конечно, хорошо, но я так и не понял, что за язык используется для скриптов? Как у него с производительностью? На мобильных платформах даже на C# местами напряжно писать из-за того же GC, например.
                  0
                  GDScript, использует синтаксис, который очень похож на язык Python. Подробнее можно ознакомиться на страничке разработчиков, посвящённой этому языку.
                  0
                  я бы добавил libglu-dev еще в «список для убунты», а другие дистрибутивы — телепатически додуманы будут :-)
                    0
                    Добавил. Список зависимостей указан. Я думаю «другие дистрибутивы» разберутся много лучше пользователей Ubuntu.
                    зависимость libglu-dev добавлена уже после написания статьи. Дополняю рукопись ссылкой на раздел wiki сайта программы с компилированием для Linux. Вдруг ещё что добавят…
                    0
                    Редактор ключей немного адский пока что не могу понять как отдельный ключ удалить, но UX доработают.

                    Кстати 8 ключей — это перебор, достаточно первого и последнего и между ними включить линейную непрерывную интерполяцию, так что будет 2 синих точки.
                      0
                      Про редактор специально ничего не писал. Ибо у самого возникли трудности при удалении. Будем ждать.

                      Про 8 ключей — не знал. Учтём в следующем уроке при добавлении новой анимации (Например, врагов).
                      0
                      Скрипт проще создать кнопкой скрипта на панели нодов, тогда и наследование добавится автоматом. Скрипт тут вообще не нужен, достаточно нажать кнопку автоплей при создании анимации. Камера в примере не используется, так что пока тоже не нужна.

                      Only users with full accounts can post comments. Log in, please.