3D в игре на Flame: от одной модели до целого мира
Представьте: вы пишете 2D-игру на Flame, но хотите добавить в неё полноценный 3D-мир. Звучит как боль? Разработчики из pleiondev решили эту задачу, создав мост между 2D-логикой и 3D-рендерингом. Результат — браузерный шутер River Sortie в стиле классического River Raid, где самолёт летит над бесконечной рекой, уничтожая танкеры и мосты.
🚀 Ключевая фишка — пакет flame_flutter3d. Он позволяет встраивать 3D-модели прямо в 2D-сцену Flame. Есть два режима: простой (одна модель через Model3dComponent) и полный (отдельный 3D-мир с камерой и физикой). Во второй вариант и упирается River Sortie.
💡 Архитектурно это выглядит как Stack: снизу 3D-сцена, сверху 2D-логика Flame. Так сделано не случайно: в браузере 3D-поверхность — это platform view, и именно она ловит события мыши. Поэтому интерактивные элементы игры должны быть «выше» в дереве виджетов.
⚡️ Главная проблема интеграции — синхронизация времени. Два независимых таймера (для 2D и 3D) неизбежно рассинхронизируются. Решение — единый тикер. Компонент BridgeClock с приоритетом 1
Представьте: вы пишете 2D-игру на Flame, но хотите добавить в неё полноценный 3D-мир. Звучит как боль? Разработчики из pleiondev решили эту задачу, создав мост между 2D-логикой и 3D-рендерингом. Результат — браузерный шутер River Sortie в стиле классического River Raid, где самолёт летит над бесконечной рекой, уничтожая танкеры и мосты.
🚀 Ключевая фишка — пакет flame_flutter3d. Он позволяет встраивать 3D-модели прямо в 2D-сцену Flame. Есть два режима: простой (одна модель через Model3dComponent) и полный (отдельный 3D-мир с камерой и физикой). Во второй вариант и упирается River Sortie.
💡 Архитектурно это выглядит как Stack: снизу 3D-сцена, сверху 2D-логика Flame. Так сделано не случайно: в браузере 3D-поверхность — это platform view, и именно она ловит события мыши. Поэтому интерактивные элементы игры должны быть «выше» в дереве виджетов.
⚡️ Главная проблема интеграции — синхронизация времени. Два независимых таймера (для 2D и 3D) неизбежно рассинхронизируются. Решение — единый тикер. Компонент BridgeClock с приоритетом 1