{{notification.text}}

MirGames

clipboard.png

Наверное, почти каждый из нас когда-либо писал свой Игровой Движок. Это детище, которое холится и лелеется… И безжалостно переписывается раз за разом. Рано или поздно детище забрасывается, и автор начинает заниматься чем-то более полезным, но время от времени из этих экспериментов рождается что-то дельное.

Так, в начале прошлого года, из под рук Javier Canto, MVP в области XNA и C#, и его нескольких единомышленников, после двух лет разработки вышел Wave Engine . Авторы ставили перед собой целью помощ сообществу разработчиков мобильных игр. Информации о нём на русском языке практически нет, поэтому я хочу внести свой вклад в судьбу этого движка и сделать для него небольшой обзор.

WaveEngine написан под платформу .NET, но, используя Xamarin, можно создавать Android/iOS/OUYA игр. В следующем релизе появится поддержка MacOS. При условии вывода сплэш-скрина на старте приложения, движок можно использовать совершенно бесплатно.

К сожалению, список проектов, использующих WaveEngine пока не так велик. Пожалуй, можно отметить лишь "BBB: App-ocalypse ", своеобразную игру про убийство зомби в стиле Tower Defense, получившую множество хороших отзывов в Windows Marketplace и миллион скачиваний.

wave.png

Кратко о фичах движка:

  1. Компонентно-ориентированная архитектура с поддержкой Fluent Interface.
  2. Батчинг геометрии, 2д спрайтов, встроенная система частиц, frustum culling, и поддержка слоёв.
  3. Движок интегрирован с Farseer Physics Engine, поэтому физика доступна из коробки.
  4. Встроенная система компоновки и библиотека контролов для упрощения создания UI.
  5. Кросс-платформенная библиотека материалов.
  6. Вспомогательные классы для создания системы in-app purchase.
  7. Bones-анимация. Для 2D интеграция со Spine.

Техно-демка движка:

The Secret Of Isis

Я использовал WaveEngine для того, чтобы за пару вечеров написать простенький тетрис на сотый конкурс IGDC, и этот движок показался мне довольно удобным. Например, вот так создаётся спрайт:

var blockEntity = new Entity(block.Id)
    .AddComponent(new SpriteRenderer(DefaultLayers.Alpha))
    .AddComponent(new Sprite("Content/block.wpk") { TintColor = block.Color })
    .AddComponent(
        new Transform2D
            {
                X = GetBlockPosition(block).X,
                Y = GetBlockPosition(block).Y,
                DrawOrder = 0.4f
            });

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

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

13.01.14 03:07

Комментарии

18.01.14 00:10

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

Впрочем, свое удовольствие от изучения того что есть я получил. Одобряю.

18.01.14 00:10

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

Что характерно, они их исправили за пару дней!

19.01.14 03:27

но он оказался еще пока сыроват.

А ты какую версию использовал? У них 1.2 как-раз в июле вышла. Из тех проблем, с которыми я столкнулся, это лишь не сразу удалось запустить Assets Exporter - пришлось немного пошаманить, так как установщик глючил.

21.01.14 20:52

не сразу удалось запустить Assets Exporter - пришлось немного пошаманить, так как установщик глючил.

Я вообще не сразу понял что там есть установщик...

А ты какую версию использовал
Не припомню. Был трабл с масштабированием и определением координат + трабл с камерой в 2д. В остальном норм. Ну и оперативность порадовала.

21.01.14 21:08

трабл с камерой в 2д

А, это есть, да. Координаты дочерних компонент очень странно зависят от родительских, поэтому реализовать камеру с помощью объекта-контейнера, который мы перемещаем, не получается.

({{comment.CreationDate | date:'dd.MM.yy HH:mm'}})
Отредактировано: {{comment.UpdatedDate | date:'dd.MM.yy HH:mm'}}