Инженеры Dart изучают раздел Stack Overflow« Flutter gamedev », Фото Елены Журавлевой.

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

И то, как устроен человеческий мозг, о, эта ужасно блестящая оптимизационная машина, мы часто склонны начинать свой проект с того, с чем мы уже знакомы, или с того, что все используют. Первый был моим выбором, и это был период моего полного увлечения Flutter. Короче говоря, я начал писать с ним игру, и вот что я узнал.

№1: Сообщество Dart любит имена библиотек, начинающиеся с «F».

Я понимаю, что это утверждение кажется надуманным, но вот некоторые цифры из pub.dev:

И, в частности, есть 907 (более 74%) пакетов, имена которых начинаются с flutter в специфический. Так что есть большая вероятность, что если вам что-то не хватает в экосистеме дротиков, попробуйте поискать слово «f» :)

Данные были собраны с помощью следующего скрипта Puppeteer 🙌:

const puppeteer = require('puppeteer');
const alphabet = 'poiuytrewqlkjhgfdsamnbvcxz'.split('');
(async () => {
  let results = {};
  const browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});
  const page = await browser.newPage();
  await page.setViewport({ width: 1024, height: 768 });
  
  for (let char of alphabet) {
    await page.goto(`https://pub.dev/packages?q=package%3A${char}`);
    const el = await page.$('.package-count span');
    const count = await (await el.getProperty('textContent')).jsonValue();
    results[char] = parseInt(count);
    await page.screenshot({path: `pub/${char}.png`});
  }
  console.log(JSON.stringify(results, null, 2));
  await browser.close();
})();

# 2: лучший игровой движок Flutter - это Flame 🔥

Еще одно доказательство вышеприведенного утверждения: Flame - это лучший игровой движок Flutter на сентябрь 2019 года. Это отличная библиотека с удобными API-интерфейсами, позволяющими избежать самостоятельной реализации игрового цикла и абстракций компонентов. как возможность удобно встроиться где-нибудь в дереве виджетов. Однако Flame еще далеко даже от движков, которые считаются маленькими (например, Phaser, Pixi.js или Babylon.js), и далеко от таких монстров, как Unreal Engine или Unity.

С другой стороны, простота Flame великолепна в том смысле, что вы можете просто читать его исходники и быстро изменять код, чтобы он делал то, что он должен делать, вместо того, чтобы тратить полдня на документацию и порталы сообщества, чтобы найти thatMethodWhichDoesWhatYouNeeded. И их руководство по началу работы не наводит на мысли о черных ящиках и магии. В то же время, если вам нужно что-то конкретное, почти наверняка, его еще нет.

Отказ от ответственности: я не имею отношения к игровому движку Flame, мнение выше субъективно.

# 3: Напишите это сами

Да, это может быть серьезным сдвигом парадигмы, особенно если вы пришли из плодородных земель современного Javascript с легкодоступными NPM более миллиона пакетов. Dart еще нет, и вы окажетесь в ситуации, когда то, что вам нужно, еще не написано кем-либо еще во всем мире.

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

Так что будьте готовы самостоятельно писать системы для повышения уровня, инвентаризации, сохранения настроек и многого другого.

# 4: Flutter дает вам полный контроль над тем, что отображается на экране

Это правда, и не одновременно, так что своего рода квантовое утверждение.

Изображение предоставлено: Kurzgesagt - в двух словах

Сворачивая волновую функцию этого оператора, вы наблюдаете себя в ситуации, когда вы действительно контролируете каждый пиксель на экране, но осталось не так много кода Dart, который использует стандартные API-интерфейсы Flutter или виджеты. Но в то же время использование возможностей фреймворка для рендеринга ограничивает вас несколькими способами, поэтому вы не получите тот же уровень контроля, если останетесь в рамках фреймворка виджетов. Но, как и в любом квантовом явлении, реальность окажется в обоих состояниях. Flutter и виджеты для игрового пользовательского интерфейса и холста, а также пользовательские рисовальщики для тех мест, где вам действительно нужен полный контроль. Таким образом, вы по-прежнему получаете удивительное удобство API-интерфейсов Flutter для реальных интерфейсов, но получаете полный доступ к холсту для реального просмотра игры.

# 5: Полный контроль не полный

Да, да, я прошу прощения за такой стереотипный поворот в сюжете статьи, но если вы действительно рассматриваете возможность использования Flutter для разработки игр из-за его «полного контроля» над тем, что происходит на экране, вам следует иметь несколько ограничений. быть осведомленным.

Прежде всего, если вы ищете истинную мощь, вы, скорее всего, в конечном итоге поработаете с Flutter на слое dart: ui. Вы можете найти больше информации о многоуровневой архитектуре Flutter в статье Flutter: Сквозь лес абстракций. О боже, этот слой - Дарт. Между нами я был не готов к некоторым вещам, которые там происходят. Некоторые из ограничений:

- Доступ к содержимому холста можно было получить только асинхронно и только через привязанный PictureRecorder. Это означает, что вы не можете копировать все содержимое игрового изображения после каждого кадра, применить какое-то преобразование к каждому пикселю, а затем отрендерить его обратно, как я пытался.

- У вас нет доступа к полному API Skia с холстом dart: ui. Так что если вы хотите написать шейдеры для своей игры, это пока невозможно.

- dart: ui Объект Путь не позволяет получить доступ к данным точек внутри пути, несмотря на то, что он явно доступен.

- Если вы хотите, чтобы в вашей игре были 3D-сцены, вам нужно будет написать всю логику проекции самостоятельно. Это возможно, но оно будет работать исключительно на ЦП, так что это не лучшая идея как с точки зрения производительности, так и с точки зрения затрат времени.

В целом, работая с Flutter на этом уровне, я почувствовал, что есть пробелы в API и реализации, которые не применимы напрямую к рендерингу 2D UI, но в то же время, если ваша ниша - это 2D-игра со спрайтами, вы, вероятно, не будете слишком сильно ограничены. .

Так стоит ли мне вообще подумать об использовании Flutter для мобильных игр?

Написание игр с флаттером - это приключение, написание приключенческой игры с ним было бы приключением в квадрате. Лично мне нравится как Dart, так и Flutter экосистема, а также я не боюсь делать немного сложного кодирования, например, писать кодировщик BMP или интерполятор для матриц преобразования. Но это может быть неприменимо для вас, поэтому, если вы ищете ответ, можно ли Flutter для написания мобильных игр, как и в сотнях других сообщений в блогах, ответ будет квантовым.

Да, если по крайней мере два из них верны:

  • Вы делаете это как побочный проект для развлечения и опыта
  • Вам нравится Dart и Flutter экосистема
  • Вы не против программирования некоторых базовых вещей с нуля

Нет, если любое из этих значений верно:

  • Вы ищете самый быстрый способ продвижения на рынок для своего следующего продукта.
  • У вас нет опыта разработки игр, связанных с другими технологиями.

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

Спасибо, что сделали это здесь! Если у вас есть интересная история о написании игр с Flutter, напишите, пожалуйста, несколько строк в комментариях или напишите мне на [email protected], думаю, нам будет о чем поговорить!

И да, вы не увидите в этом посте никаких бессовестных затычек про мою собственную игру или что-то в этом роде :)

Отлично проведите время с Flutter (и, возможно, с Flame)!