Можливо, перша гра на Dart + Box2D

На Хабре не дуже багато статей, присвячених мові програмування 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(callback Function) {
(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 спроб, всього з десяток людей пройшло обидві голови, хоча, може, це і правильний відсоток?

image

UPD: Лінк для тих хто хоче подивитися, що вийшло в результаті: vk.com/twocubes

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.