Игровые движки на Go

16 minute read

Конечно, Go не задумывался как язык для написания игр. Но чем еще заняться холодными осенними вечерами? Давайте попробуем запустить несколько игровых движков и посмотреть, как в Go-мире обстоят дела с геймдевом.

GarageEngine

Наш первый экземпляр - это 2d игровой движок для Go, который работает на OpenGL. Он состоит из модулей/компонентов. Сейчас уже есть приличное количество таких модулей для шрифтов, спрайтов, текстур, физики, сцен и так далее. Очень сильно ощущается влияние Unity3d. Особенно в названиях компонентов: Scene, Coroutines, Components, Transform, GameObjects и т.д.

К сожалению это проект для обучения. Не стоит ожидать от него супер-килер-фич и обратной совместимости.

Установка

Нам нужно установить либы glfw и glew

sudo apt-get update
sudo apt-get install build-essential binutils-gold \
freeglut3 freeglut3-dev libalut-dev libglew-dev \
libglfw-dev libxrandr2 libxrandr-dev

Если вы используете windows вам нужно юзать mingw и собрать glew.

go get github.com/vova616/GarageEngine

Примеры

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

Прежде всего заходим в папку src/github.com/vova616/GarageEngine и собираем все руками:

go build main.go

Если появилась ошибка вида:

# github.com/vova616/GarageEngine/engine/audio
.godeps/src/github.com/vova616/GarageEngine/engine/audio/AudioSource.go:129: 
undefined: openal.DistanceModel

Комментируем строки 128-130 в файле src/github.com/vova616/GarageEngine/engine/audio/AudioSource.go

if currentDistanceModel != this.distanceModel {
  openal.SetDistanceModel(openal.DistanceModel(this.distanceModel))
}

Пытаемся запустить и получаем ошибку listen tcp 0.0.0.0:123: bind: permission denied. Меняем номера портов в файле src/github.com/vova616/GarageEngine/spaceCookies/server/Server.go на строке 88

addr, err := net.ResolveTCPAddr("tcp", "0.0.0.0:12345")

и в файле src/github.com/vova616/GarageEngine/spaceCookies/game/Client.go строки 19 и 20

const ServerIP = "localhost:12345"
const ServerLocalIP = "localhost:12345"

Опять пробуем запустить и ничего не получается. Рядом с нашим бинарником лежит файл log.txt c примерно таким содержимым:

Enginge started!
GLFW Initialized!
Opengl Initialized!
open ./data/spaceCookies/background.png: no such file or directory
open ./data/spaceCookies/button.png: no such file or directory
runtime error: invalid memory address or nil pointer dereference panic.c:482, 
os_linux.c:234, Sprite.go:42, LoginScene.go:83, Engine.go:96, 
main.go:78, main.go:44, proc.c:220, proc.c:1394

Видим, что программа пытается найти файлы ./data/spaceCookies/background.png и ./data/spaceCookies/button.png. А папка, на самом деле, называется ./data/SpaceCookies. Переименовываем папку и снова запускаем. Ура! Теперь все работает.

Если лень фиксить все эти баги, можете посмотреть демки, как это все работает.

☣ Azul3D

Azul3D это 3D движок написанный полностью с нуля на языке программирования Go. Azul3D подходит для создания 2D и 3D игр. Так же, его можно использовать для создания не игровых, а просто интерактивных приложений. В отличии от большинства современных движков(таких как Unity, JMonkey) у Azul3D нет дополнительных фич типа редакторов уровней, IDE. Это просто набор необходимых разработчику пакетов.

Это игровой движок от программистов для программистов. Он очень минималистичен, но легко расширяется в отличии от других движков.

Azul3D предоставляет самые необходимые инструменты, которые будут использоваться изо дня в день. И делает это действительно хорошо.

Установка

Начинаем с зависимостей для Ubuntu 14.04. Для других систем смотрим тут.

sudo apt-get install build-essential git mesa-common-dev \
libx11-dev libx11-xcb-dev libxcb-icccm4-dev \
libxcb-image0-dev libxcb-randr0-dev libxcb-render-util0-dev \
libxcb-xkb-dev libfreetype6-dev libbz2-dev \
libxxf86vm-dev libgl1-mesa-dev

Примеры

Теперь пробуем установить примеры. Они вынесены в отдельный пакет.

go get azul3d.org/examples.v1

нам понадобится куча других пакетов:

go get azul3d.org/keyboard.v1
go get azul3d.org/lmath.v1
go get azul3d.org/gfx.v1
go get azul3d.org/gfx/window.v2
go get azul3d.org/mouse.v1
go get azul3d.org/tmx.dev

Теперь можем посмотреть примеры. Заходим в src/azul3d.org/examples.v1/azul3d_tmx и запускаем пример

go run azul3d_tmx.go

Вы увидите что-то такое:

Были проблемы с версией Go ниже 1.3. Обновился до самой последней и все отлично заработало на моей ubuntu 14.04.

gosfml

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

И конечно же, нельзя обойти стороной Go биндинги к популярной библиотеке SFML. Есть несколько вариантов, но я смог запустить только этот.

SFML - это кросплатформенная библиотека для мультимедиа. Она написана на C++, но есть куча привязок к разным языкам и к Go в том числе.

Кроме работы с мультимедиа в этой либе есть несколько пакетов для программирования простых игр.

Модули, которые нам доступны в этой библиотеке:

  • System - управление временем и потоками.
  • Window - управление окнами и взаимодействием с пользователем.
  • Graphics - делает простым отображение графических примитивов и изображений.
  • Audio - предоставляет интерфейс для управления звуком.
  • Network - для сетевых приложений.

Устанавливаем

Сначала ставим саму SFML

sudo apt-get install libsfml-dev

Так как SFML написана на C++, нам нужен C биндинг к SFML.

sudo apt-get install libcsfml-dev

Теперь устанавливаем Go биндинг

go get -u bitbucket.org/krepa098/gosfml2

Примеры

Можем собирать и запускать примеры

cd ./src/bitbucket.org/krepa098/gosfml2/samples
./buildSamples
cd sfmlPong/
./sfmlPong

И видим вот такую картинку:

Еще инструменты

Список некоторых специфических движков и инструментов, которые попадались в поиске, но до которых не дошли руки.

  • go:ngine - Многообещающий движок, но я так и не понял как его собрать и где примеры посмотреть.
  • terrago - Генератор для ландшафта
  • Newton Dynamics - Это либа 3d физики
  • horde3d - Интересный 3d движок. Стоит попробовать в будущем.
  • vmath - Либа для векторных, матричных и 3дешных расчетов
  • ENGi Мультиплатформенная либа для 2d игр. Пока в глубокой альфе.
  • OpenGL with Golang - Go биндинг к OpenGL.

Выводы

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