quasilyte.dev

Ebitengine logo

Разработка игр на Ebitengine

Тебе хочется создавать игры на Go? Ebitengine - отличный вариант.

Этот документ был создан чтобы упростить твоё путешествие.

Обсудить документ можно в чатике. Дополнения и правки приветствуются.

Стереотипы

Сначала я хочу адресовать частые стереотипы о Go и разработке игр на этом языке.

tl;dr: Go - подходящий язык, Ebitengine - неплохой игровой движок, сообщество - живое и расширяется.

Можно довольно детально сравнивать языки программирования между друг другом, определяя насколько Go подходит для разработки игр. Британские учёные доказали, что Go - достаточно хороший язык для создания игр на нём. Производительности, контроля и удобств (типа генериков) будет достаточно, чтобы создать почти любую 2D-игру.

Состояние экосистемы для разработки игр на Go не сравнится с Unity или другими меинстримовыми платформами. Тем не менее, в awesome-ebitengine можно найти внушительный список библиотек, которые в большинстве случаев оберегают нас от написания велосипедов. Подобного арсенала хватит большинству начинающим и продолжающим.

Всяких туториалов не так много, но зато изолированных примеров и игр с открытыми исходниками в достатке. На Хабре и YouTube при желании что-то найти можно.

Сообщество Ebitengine не очень громкое, но живое. Основное общение происходит в англоязычном дискорд-сервере (там очень активен автор движка - Hajime Hoshi). Для общения на русском есть t.me/go_gamedev.

Предостережения

Если у тебя есть желание попробовать делать игры на Go - нужно дать этому шанс. Но, вместе с этим, мне нужно тебя предупредить об особенностях этого выбора.

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

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

Ebitengine больше всего подходит для 2D игр, хотя сделать что-то трёхмерное на нём всё же можно.

Кратко об Ebitengine

Ebitengine - это довольно минималистичный игровой движок для создания игр на Go.

В отличие от Unity, где ядро движка написано на C++, а игры пишутся в основном на C#, в Ebitengine нет такого разделения. И движок, и игры, здесь пишутся на Go. Ebitengine используется как библиотека. Программа на Go подключает Ebitengine и запускает его из своего main(). У этого довольно много преимуществ:

Этот список далеко не полон!

Из этого также следует, что при изменении кода игры требуется пересобрать проект. Так как Go компилируется очень быстро, обычно это занимает всего несколько секунд (хотя решения для hot-reload найти можно).

Игры, сделанные на Ebitengine, могут работать на разных платформах: Windows, MacOS, Linux, FreeBSD, iOS, Android, wasm (в браузере), Nintendo Switch и Xbox! Здесь работает стандартный подход Go: под каждую платформу мы компилируем отдельный исполняемый файл (иногда с помощью кросс-компиляции, иногда с помощью дополнительных инструментов типа gomobile).

Процесс обучения

Я бы выделил следующие этапы освоения:

  1. Знакомство с базовыми возможностями Ebitengine
  2. Создание небольших и простых игр на “голом” Ebitengine
  3. Освоение 3rd party библиотек, которые потребуются в более крупных играх
  4. Создание собственных наработок и хелперов
  5. Этап, когда ваша продуктивность на Ebitengine будет очень высокой

На Хабре сейчас готовится серия статей с введением в разработку игр на Ebitengine. Если формат статей нравится, то стоит ознакомиться:

  1. Делаем RPG на Go: часть 0
  2. Делаем RPG на Go: часть 0.5
  3. *В процессе написания*

Когда все статьи будут выпущены, я начну работать над видео с таким же содержанием.

Если хочется разобраться во всём самостоятельно, то остальную часть документа можно считать подсказками.

Установка Ebitengine

$ git clone --depth 1 https://github.com/hajimehoshi/ebiten.git
$ cd ebiten

Нужно будет установить dev-зависимости чтобы работала компиляция игр.

Полезные примеры Ebitengine

На мой взгляд, начать можно с этих examples:

# Запускайте игру, посмотрите на её "фичи", а затем запускайте следующую.
$ go run ./examples/blocks
$ go run ./examples/flappy
$ go run ./examples/2048
$ go run ./examples/snake

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

Всего доступно 80+ примеров. Большая часть из них очень минималистичная, чаще всего их задача продемонстрировать решение конкретной маленькой задачи.

Я очень рекомендую экспериментировать, редактировать код, модифицировать игровые механики.

Все игры из примеров используют ассеты из examples/resources.

Создание первой игры

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

Вот примеры игр, которые могут быть хорошим упражнением для неофита Ebitengine:

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

На данном этапе не нужно переусложнять структуру проекта. Если удобно всё делать в одном Go-пакете - так и делайте. Вместо идеальных решений применяй то, что можно сделать в этот же вечер. Сторонние библиотеки брать можно, но освоить ядро Ebitengine всё равно стоит.

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

Сторонние библиотеки

Начинать поиск можно с awesome-ebitengine. Можно ещё попробовать поиск topic=ebiten.

Для своих игр я использую эти библиотеки:

Для pixel-art игр могут быть полезны bitmap шрифты:

Эти библиотеки более специфичные, но тоже могут быть полезны:

Полезные инструменты

Здесь указаны только некоторые инструменты. Рекомендации тут очень субъективные.

Ebitengine - это code-first игровой движок, тут нет обязательной IDE.

Если хочется визуально создавать уровни для игры, можно взять Tiled или LDtk.

Для редактирования спрайтов: aseprite (или libresprite), Krita.

Для генерации простеньких звуков рекомендую sfxr (или его аналоги). Редактирую звуки я в Audacity.

Ресурсы для игр

Мне очень нравится модульная музыка, поэтому я рекомендую modarchive. Треки в формате XM можно воспроизводить в игре напрямую. Большую часть остальных форматов (IT, MOD, S3M) можно конвертировать в XM через MilkyTracker.

На itch.io есть довольно много хороших ассетов, часть из которых доступна бесплатно (идеально для прототипов). Примеры того, что там можно найти: спрайты, тайлсеты, наборы эффектов.

Отдельно рекомендую всякие конструкторы, типа retro-sprite-creator. Я настолько люблю конструкторы, что когда-то создал свой конструктор для гоферов.

Делитесь своим прогрессом

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

Если появилось желание опубликовать игру, то рекомендую itch.io. Ebitengine позволяет собирать игры под веб (wasm-билд), а itch.io будет приятным хостингом для такой игры.

После публикации игры на itch.io, попросите в каком-нибудь из чатиков сообщества добавить вашу игру в список itch.io/made-with-ebitengine.

Для игр с открытыми исходными кодами можно добавить её в список awesome-ebitengine/games.