На Хабре не слишком много статей, посвященных языку программирования Dart, зато полным полно статей о недоделанных или с трудом доделанных играх, а также о том, как из первых сделать вторые. Данная статья будет смесью этих двух тем.
Дело обстояло так: мы с моим старым другом уже не первый год занимаемся разработкой. Игра, о которой пойдет речь в статье, уже далеко не первая, которую мы пытались сделать, но первая, с которой это удалось. После почти десятка неудавшихся попыток сделать игру мы наконец-то смогли объективно оценить свои силы и решили сделать головоломку. Жанр игр сам по себе несложный, но то, что мы задумали, было куда сложнее и не похоже ни на одну из игр, представленных в каталогах ВК и ФБ в этом жанре. Для того, чтобы совсем не осталось шансов закончить игру, решили использовать те технологии, которые никогда в глаза не видели — Dart + Box2d.
Теперь о впечатлениях от разработки на дарте. Это очень отличается от разработки на java/c#/php как минимум тем, что ты не можешь нагуглить ответ на мало-мальски сложный вопрос, что одновременно злит и дает тебе ощущение первопроходца. Еще существенное отличие в сырости технологии в целом, а инструментов в частности.
Dart Language
Сразу скажу, что язык был выбран из-за строгой типизации и классического подхода к ООП. Наверное, больше всего язык похож на Java, в общем, код многих методов можно просто взять вставить в java и они без проблем отработают, иногда этот трюк может пройти даже с целым классом. Из отличий ключевое, на мой взгляд, это поддержка процедурной парадигмы, которая несколько развращает код иногда позволяет упростить код решения задачи. Следующим ударом по безопасности удивлением стало отсутствие модификаторов доступа для классов, методов и полей. Первое время я противился искушению, но потом такие возможности взяли свое и в результате я получил очень сильно связанный код, который вряд ли кто-то в этом мире признает хорошим, но это вряд ли проблема языка, а скорее недостаток опыта в целом и полное его отсутствие в отношении дарта, особенно в самом начале пути.
Dart Editor (DE)
DE был сделан на основе Eclipse, что само по себе еще не делает его плохим, но заставляет насторожиться. Через время использования DE начинает казаться, что корпорация добра в последний момент вырезала все приятные функции Eclipse. Благо, нашелся плагин для любимого PhpStorm, который тоже сыроват, но здесь хотя бы в IDE чувствуешь себя на родной земле.
Dart Pub
Стоит сказать, что в плане пакетов гугл очень постарались. Есть общий каталог пакетов, в один клик можно получить нужную библиотеку.
The Dartium binary expires after 12 weeks
Абсолютно невероятной особенностью разработки на этом чудном языке стало то, что Dartium (Chromium с виртуальной машиной для дарта) нужно заново скачивать и устанавливать каждые 12 недель, а если этого не сделать, то DartVM как будто исчезало, и то, что работало еще вчера, в миг переставало работать вообще.
Box2D
Box2d для Dart — сразу хочу сказать, что впервые работаю с этой библиотекой и в процессе ее изучения было несколько вещей, которые сильно удивляли, но со временем все улеглось в голове, и стало ясно, что Box в целом как раз то, что нужно, а порт, на удивление, хорош.
Dart2JS
Dart2JS — это утилита, поставляемая с пакетом для разработки на дарте, для построения из dart кода, понятного лишь крошечной кучке людей во вселенной, в js, который в том виде, в котором он получается, не понятен вообще никому, кроме браузера. Хотя, на самом деле, это один из приятных моментов разработки, хоть и что бы сбилдить проект, первый раз пришлось убить порядочное количество времени. Надо отметить, что пока не встретили ни одного бага связянного с неверным построением JS. кода. Он, кстати, получается, как и следовало ожидать, абсолютно нечитаемым.
Dart & JS
Конечно, используя дарт, возникает иногда желание или/и необходимость использовать JS код, там для этого предусмотрен в целом неплохой инструментарий, но им невозможно пользоваться. Сейчас попробую объяснить. Это лучшая библиотека, которая могла быть для работы с JS, но для настолько связанного с JS языка, я считаю эта поддержка должна была быть перенесена на уровень языка, синтаксис мог бы быть чем-то похож на использование asm из С
Сейчас это выглядит в лучшем случае примерно так:
static void getUser(Function callback) {
(context['Features'] as JsObject).callMethod('getUser', [new JsFunction.withThis((JsObject obj) {
callback();
})]);
}
Dart & External Api
Я всегда был влюблен в API VK, оно мне казалось и до сих пор кажется примером правильно реализованого API для веб-сервиса. Кроме всего прочего, ВК поставляет и js-библиотеку для удобного доступа к своему API. Разрабатывая другие приложения для соцсетей, мне всегда нравилось пользоваться этой библиотекой, но когда пришлось обращаться к ней из дарта, это превратило сказку в кошмар, потому я постарался его спрятать в самый дальний класс своего проекта и пореже его открывать. Все дело в том, что, как я и говорил, работа с JS в дарте реализована как библиотека и требует постоянных манипуляций с объектами т.о. львиную долю времени на обертки дарт-объектов в JsObject и выковыриванию из других JsObject тех немногих нужных мне данных, ради которых это все затевалось. Но после долгих мучений я смог уменьшить точки соприкосновения языков до минимума, вынеся все взаимодействия с VkApi в отдельный JS файл, который их обрабатывал и отдавал в специально обученый класс дарта.
Two Cubes
Разработка игры заняла намного больше времени, чем хотелось бы, как это часто и бывает. В любом случае, это первая игра, которую наконец удалось закончить. Главной проблемой ее доставки в массы скорее всего станет то, что она получилась довольно сложная, даже не в плане управления, а именно как головоломка. Например, из 2000 человек, которые сейчас в нее играют, потратив почти 15000 попыток, всего с десяток человек прошло обе главы, хотя, может, это и правильный процент?
Автор: podkolzzzin