Игровые движки на Go
Конечно, 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 не задумывался для написания игр. Конечно, если вы хотите потратить несколько вечеров ради развлечения, то все нормально. Но для серьезных проектов стоит выбрать что то более подходящее.