- Phaser 3 + bitECS 0.4 + TypeScript + Vite stack - BootScene with title screen - 6 cursor rules (project context, agent workflow, ECS, chemistry, Phaser, data) - Vitest configured with happy-dom - GDD, engine analysis, implementation plan, progress tracking Co-authored-by: Cursor <cursoragent@cursor.com>
329 lines
23 KiB
Markdown
329 lines
23 KiB
Markdown
# Выбор движка для агентной разработки в Cursor
|
||
|
||
## Критерии оценки
|
||
|
||
Для **полностью агентной** разработки (AI-агент в Cursor пишет весь код) критически важны:
|
||
|
||
| Критерий | Почему |
|
||
|----------|--------|
|
||
| Качество генерации кода | AI должен хорошо знать язык и фреймворк |
|
||
| Всё-в-коде | Никаких визуальных редакторов — агент работает только с текстовыми файлами |
|
||
| Сборка/запуск из терминала | Агент запускает через Shell tool |
|
||
| Визуальная проверка | Агент может УВИДЕТЬ результат (критично для отладки графики) |
|
||
| Скорость итерации | Hot-reload, быстрый цикл «изменил → увидел» |
|
||
| Экосистема библиотек | Для химии, математики, процедурной генерации |
|
||
| Возможности 2D-движка | Тайлмапы, физика, частицы, шейдеры, камера |
|
||
|
||
---
|
||
|
||
## Кандидаты
|
||
|
||
### 1. TypeScript + Phaser 3 + bitECS + Vite
|
||
|
||
**Язык:** TypeScript — один из лучших для AI-генерации. Строгая типизация ловит ошибки до рантайма. Огромный объём обучающих данных у моделей.
|
||
|
||
**Всё-в-коде:** Полностью. Ни один файл не требует визуального редактора. Конфиги, сцены, уровни — всё на TypeScript/JSON.
|
||
|
||
**Сборка/запуск:** `npm run dev` → Vite поднимает сервер с HMR за <1 секунду.
|
||
|
||
**Визуальная проверка:** **Killer feature** — Cursor имеет встроенные Playwright browser tools. Агент может:
|
||
- Открыть `localhost:5173` в браузере
|
||
- Сделать скриншот игры
|
||
- Прочитать console.log ошибки
|
||
- Кликнуть по элементам UI
|
||
- Проверить результат визуально
|
||
|
||
Ни один другой стек не даёт агенту такой обратной связи.
|
||
|
||
**Скорость итерации:** Vite HMR — изменения видны мгновенно, без перезапуска. Для игры это означает: поменял логику врага → сразу видишь в браузере.
|
||
|
||
**Экосистема:**
|
||
- `bitecs` — высокопроизводительная ECS (~5kb, TypedArrays, SoA-layout, до десятков тысяч сущностей)
|
||
- `simplex-noise` — шум для процедурной генерации
|
||
- Любые npm-библиотеки для математики, графов, pathfinding
|
||
|
||
**2D-возможности Phaser 3:**
|
||
- Спрайты, атласы, тайлмапы
|
||
- Arcade/Matter.js физика
|
||
- Система частиц
|
||
- Камеры, зум, следование
|
||
- Tweens и анимации
|
||
- WebGL-шейдеры (пайплайны)
|
||
- Ввод: клавиатура, мышь, тач, геймпад
|
||
- Аудио
|
||
- Scene-менеджер
|
||
|
||
**Производительность:** WebGL-рендер, батчинг до ~2000 спрайтов/batch. bitECS для логики — Structure of Arrays, итерация по компонентам на скорости, близкой к нативной. Web Workers для тяжёлой симуляции (экология, химия) в отдельном потоке.
|
||
|
||
```
|
||
Агентопригодность: ██████████ 10/10
|
||
Визуальная отладка: ██████████ 10/10
|
||
Язык для AI: ██████████ 10/10
|
||
Скорость итерации: ██████████ 10/10
|
||
2D-возможности: ████████░░ 8/10
|
||
Производительность: ███████░░░ 7/10
|
||
Экосистема: █████████░ 9/10
|
||
─────────────────────────────────────
|
||
ИТОГО: 64/70
|
||
```
|
||
|
||
---
|
||
|
||
### 2. Godot 4 + GDScript
|
||
|
||
**Язык:** GDScript — Python-подобный, AI знает его удовлетворительно, но значительно хуже TypeScript/Python. Меньше обучающих данных. Ошибки чаще.
|
||
|
||
**Всё-в-коде:** Почти. `.tscn` и `.tres` файлы текстовые и генерируемые. Формат специфичен, но [godot-mcp](https://github.com/Coding-Solo/godot-mcp) (MCP-сервер для Godot, 1.8k stars) снимает эту проблему: создание сцен, добавление нод, загрузка спрайтов — через MCP API без ручного конструирования `.tscn`.
|
||
|
||
**Сборка/запуск:** `godot --headless --path . --script test.gd` — работает. С godot-mcp — запуск/остановка проекта и захват debug output через MCP-инструменты. Логическая отладка решена.
|
||
|
||
**Визуальная проверка:** Остаётся слабым местом. godot-mcp не поддерживает скриншоты viewport — агент видит только console output. Альтернатива — HTML5-экспорт + Playwright, но цикл итерации длинный: сохранение → экспорт (секунды) → перезагрузка браузера → скриншот (~15-30 сек vs. ~1-2 сек у Phaser + Vite HMR). Для логики — достаточно. Для визуала (шейдеры, фракталы, анимации) — сильно уступает Phaser.
|
||
|
||
> **Watch list:** если godot-mcp добавит viewport capture (Godot технически умеет сохранять viewport в изображение через `get_viewport().get_texture().get_image().save_png()`), разрыв с Phaser сократится радикально. Следить за развитием проекта.
|
||
|
||
**Скорость итерации:** Средняя. GDScript не компилируется, но перезапуск сцены — не мгновенный. С веб-экспортом цикл ещё длиннее.
|
||
|
||
**2D-возможности:** Лучшие в классе. Встроенные тайлмапы, физика, анимация, частицы, шейдеры, сигналы, scene tree.
|
||
|
||
**Производительность:** Отличная для 2D. GDNative/C# для критических участков.
|
||
|
||
```
|
||
Агентопригодность: ███████░░░ 7/10 (↑ благодаря godot-mcp)
|
||
Визуальная отладка: ████░░░░░░ 4/10 (HTML5-экспорт; viewport capture пока нет)
|
||
Язык для AI: ██████░░░░ 6/10
|
||
Скорость итерации: ██████░░░░ 6/10
|
||
2D-возможности: ██████████ 10/10
|
||
Производительность: █████████░ 9/10
|
||
Экосистема: ██████░░░░ 6/10 (↑ godot-mcp как часть экосистемы)
|
||
─────────────────────────────────────
|
||
ИТОГО: 48/70
|
||
```
|
||
|
||
---
|
||
|
||
### 3. Godot 4 + C#
|
||
|
||
Тот же Godot, но на C#.
|
||
|
||
**Преимущество:** C# AI знает отлично. Строгая типизация. NuGet-пакеты.
|
||
|
||
**Недостаток:** Компиляция медленнее GDScript. Требует .NET SDK. Визуальная проверка — через HTML5-экспорт (те же ограничения). godot-mcp работает и с C#-проектами.
|
||
|
||
```
|
||
Агентопригодность: ███████░░░ 7/10 (↑ благодаря godot-mcp)
|
||
Визуальная отладка: ████░░░░░░ 4/10 (HTML5-экспорт; viewport capture пока нет)
|
||
Язык для AI: ████████░░ 8/10
|
||
Скорость итерации: █████░░░░░ 5/10
|
||
2D-возможности: ██████████ 10/10
|
||
Производительность: █████████░ 9/10
|
||
Экосистема: ███████░░░ 7/10
|
||
─────────────────────────────────────
|
||
ИТОГО: 50/70
|
||
```
|
||
|
||
---
|
||
|
||
### 4. Python + Pygame-CE
|
||
|
||
**Язык:** Python — абсолютный лидер для AI-генерации кода. Максимальное качество.
|
||
|
||
**Всё-в-коде:** Полностью.
|
||
|
||
**Визуальная проверка:** Нет. Pygame рисует в собственном окне, которое Playwright не видит.
|
||
|
||
**2D-возможности:** Минимальные. Спрайты и рект — есть. Тайлмапы, физику, частицы, камеру — писать с нуля.
|
||
|
||
**Экосистема:** Лучшая для научных вычислений (numpy, scipy). Химическая симуляция на numpy будет быстрой.
|
||
|
||
**Производительность:** Потолок. Для тысяч сущностей без оптимизаций будет тормозить. Numpy помогает, но рендер — бутылочное горлышко.
|
||
|
||
```
|
||
Агентопригодность: ████████░░ 8/10
|
||
Визуальная отладка: ██░░░░░░░░ 2/10
|
||
Язык для AI: ██████████ 10/10
|
||
Скорость итерации: ████████░░ 8/10
|
||
2D-возможности: ████░░░░░░ 4/10
|
||
Производительность: █████░░░░░ 5/10
|
||
Экосистема: ██████████ 10/10
|
||
─────────────────────────────────────
|
||
ИТОГО: 47/70
|
||
```
|
||
|
||
---
|
||
|
||
## Вердикт
|
||
|
||
### Победитель: TypeScript + Phaser 3 + bitECS + Vite
|
||
|
||
Решающий фактор — **визуальная обратная связь через Playwright**. Агент в Cursor может:
|
||
|
||
1. Написать код
|
||
2. HMR мгновенно применит изменения
|
||
3. Агент делает скриншот в браузере
|
||
4. Видит результат
|
||
5. Корректирует
|
||
|
||
Это замыкает цикл разработки полностью внутри агента. Ни один другой стек не даёт такой обратной связи для 2D-игры.
|
||
|
||
### Архитектура проекта
|
||
|
||
```
|
||
synthesis/
|
||
├── package.json
|
||
├── tsconfig.json
|
||
├── vite.config.ts
|
||
├── index.html
|
||
├── src/
|
||
│ ├── main.ts # Точка входа, инициализация Phaser
|
||
│ ├── config.ts # Конфигурация Phaser
|
||
│ │
|
||
│ ├── ecs/ # Entity Component System (bitECS)
|
||
│ │ ├── world.ts # Мир ECS
|
||
│ │ ├── components/ # Компоненты
|
||
│ │ │ ├── position.ts
|
||
│ │ │ ├── health.ts
|
||
│ │ │ ├── chemistry.ts # Элементный состав сущности
|
||
│ │ │ ├── metabolism.ts # Метаболизм
|
||
│ │ │ ├── behavior.ts # Поведенческие параметры
|
||
│ │ │ └── lifecycle.ts # Фаза жизненного цикла
|
||
│ │ └── systems/ # Системы
|
||
│ │ ├── movement.ts
|
||
│ │ ├── ecology.ts # Популяционная динамика
|
||
│ │ ├── chemistry.ts # Химические реакции
|
||
│ │ ├── lifecycle.ts # Рождение → старение → смерть → разложение
|
||
│ │ └── ai.ts # Поведение существ
|
||
│ │
|
||
│ ├── chemistry/ # Химический движок
|
||
│ │ ├── elements.ts # Таблица элементов
|
||
│ │ ├── reactions.ts # База реакций
|
||
│ │ ├── engine.ts # Движок комбинаций
|
||
│ │ └── compounds.ts # Справочник соединений
|
||
│ │
|
||
│ ├── world/ # Генерация мира
|
||
│ │ ├── generator.ts # Процедурная генерация
|
||
│ │ ├── biomes.ts # Определения биомов
|
||
│ │ ├── tilemap.ts # Тайлмап-система
|
||
│ │ └── mycelium.ts # Система Мицелия
|
||
│ │
|
||
│ ├── scenes/ # Phaser-сцены
|
||
│ │ ├── BootScene.ts
|
||
│ │ ├── GameScene.ts
|
||
│ │ ├── DeathScene.ts # «Момент между» — фракталы
|
||
│ │ ├── CodexScene.ts # Энциклопедия
|
||
│ │ └── UIScene.ts # HUD поверх игры
|
||
│ │
|
||
│ ├── player/ # Всё про игрока
|
||
│ │ ├── controller.ts
|
||
│ │ ├── inventory.ts
|
||
│ │ ├── abilities.ts
|
||
│ │ └── schools.ts # Стартовые школы
|
||
│ │
|
||
│ ├── meta/ # Мета-прогрессия (между ранами)
|
||
│ │ ├── codex.ts # Кодекс знаний
|
||
│ │ ├── spores.ts # Споры (валюта)
|
||
│ │ ├── persistence.ts # Сохранение в localStorage/IndexedDB
|
||
│ │ └── cycles.ts # Трекер малых/великих циклов
|
||
│ │
|
||
│ ├── rendering/ # Визуальные эффекты
|
||
│ │ ├── shaders/ # WebGL-шейдеры
|
||
│ │ │ ├── fractal.glsl # Фрактальный шейдер для «Момента между»
|
||
│ │ │ ├── mycelium.glsl # Визуал Мицелия
|
||
│ │ │ └── distortion.glsl # Искажения при Микозе
|
||
│ │ └── particles/ # Конфиги частиц
|
||
│ │
|
||
│ ├── audio/ # Звук
|
||
│ │ ├── loops.ts # Музыкальные лупы
|
||
│ │ └── ambient.ts # Эмбиент-система
|
||
│ │
|
||
│ └── data/ # Статические данные
|
||
│ ├── elements.json # Периодическая таблица
|
||
│ ├── reactions.json # База химических реакций
|
||
│ ├── creatures.json # Определения существ
|
||
│ ├── biomes.json # Параметры биомов
|
||
│ └── lore/ # Тексты лора
|
||
│ ├── diary.json # Дневник Последнего Синтетика
|
||
│ └── codex-entries.json
|
||
│
|
||
├── assets/ # Графика, звук
|
||
│ ├── sprites/
|
||
│ ├── tilesets/
|
||
│ ├── ui/
|
||
│ └── audio/
|
||
│
|
||
├── tests/ # Тесты
|
||
│ ├── chemistry.test.ts # Тесты химического движка
|
||
│ ├── ecology.test.ts # Тесты экосимуляции
|
||
│ └── generation.test.ts # Тесты генерации мира
|
||
│
|
||
└── docs/
|
||
├── synthesis-gdd.md # Game Design Document
|
||
└── engine-analysis.md # Этот файл
|
||
```
|
||
|
||
### Ключевые зависимости
|
||
|
||
```json
|
||
{
|
||
"dependencies": {
|
||
"phaser": "^3.80.0",
|
||
"bitecs": "^0.4.0"
|
||
},
|
||
"devDependencies": {
|
||
"typescript": "^5.4.0",
|
||
"vite": "^5.4.0",
|
||
"vitest": "^2.0.0"
|
||
}
|
||
}
|
||
```
|
||
|
||
**Дополнительные зависимости** (подключаются по мере необходимости):
|
||
|
||
```json
|
||
{
|
||
"simplex-noise": "^4.0.0", // Процедурная генерация ландшафта
|
||
"ngraph.graph": "^20.0.0", // Граф Мицелия
|
||
"ngraph.path": "^1.4.0", // Pathfinding (A*, NBA*)
|
||
"rbush": "^4.0.0" // Spatial index (R-tree) для коллизий и culling
|
||
}
|
||
```
|
||
|
||
Минималистичный стек. Никаких лишних абстракций. Всё, что нужно для «Синтеза»:
|
||
- Phaser = рендер, физика, ввод, камера, сцены
|
||
- bitECS = высокопроизводительная симуляция сущностей
|
||
- Vite = мгновенная сборка
|
||
- Vitest = тесты для химического движка и экосимуляции
|
||
- ngraph = граф Мицелия + pathfinding
|
||
- rbush = пространственная индексация для производительности при тысячах сущностей
|
||
|
||
### Почему не Godot?
|
||
|
||
Godot — объективно лучший **2D-движок**. [godot-mcp](https://github.com/Coding-Solo/godot-mcp) существенно улучшил его агентопригодность: управление сценами, запуск проекта, захват debug output — всё через MCP. Но для «Синтеза» Godot проигрывает по двум параметрам:
|
||
|
||
1. **Визуальная обратная связь.** godot-mcp не поддерживает скриншоты viewport. Агент видит console output, но не экран игры. Для проекта с фрактальными шейдерами, психоделическими визуалами и сложным UI — это блокирующий минус. Альтернатива (HTML5-экспорт + Playwright) даёт цикл итерации ~15-30 сек vs. ~1-2 сек у Phaser + Vite HMR. На тысячах итераций — дни потерянного времени.
|
||
|
||
2. **Качество генерации кода.** GDScript агент знает хуже TypeScript. C# — хорошо, но компиляция добавляет задержку. godot-mcp снимает проблему `.tscn`-файлов, но не GDScript'а.
|
||
|
||
**Точка пересмотра:** если godot-mcp добавит viewport capture (технически реализуемо через `Viewport.get_texture().get_image()`), разрыв сократится до одного фактора — скорости итерации (HMR vs. перезапуск). На этом этапе Godot + C# (50/70) приблизится к Phaser (64/70) настолько, что выбор станет неоднозначным.
|
||
|
||
Сегодня — TypeScript + Phaser + browser tools = единственный стек с мгновенным замыканием цикла агентной разработки.
|
||
|
||
### Почему не Pixi.js + bitECS?
|
||
|
||
Pixi.js — более производительный 2D-рендерер, чем Phaser, с меньшим оверхедом. Раз ECS внешний (bitECS), встроенные системы Phaser частично избыточны. Однако:
|
||
|
||
- Phaser даёт **из коробки:** физику (Arcade + Matter.js), камеру с зумом и следованием, систему ввода (клавиатура + мышь + геймпад), Scene Manager, загрузчик ассетов, аудио, tweens, систему частиц. С Pixi.js каждую из этих систем — реализовывать вручную или подбирать отдельную библиотеку.
|
||
- Для **агентной разработки** это критично: каждая дополнительная самописная система — источник багов, которые агент будет долго отлаживать.
|
||
- Производительность Phaser достаточна для вертикального среза и alpha. Если на этапе beta рендер станет бутылочным горлышком — миграция рендерера на Pixi.js возможна без переписывания ECS-логики (они уже разделены).
|
||
|
||
**Вердикт:** Phaser = скорость разработки. Pixi.js = запасной вариант для оптимизации рендера.
|
||
|
||
### Риски и план действий
|
||
|
||
| Риск | Вероятность | Влияние | Митигация |
|
||
|------|-------------|---------|-----------|
|
||
| **Потолок производительности браузера** — тысячи сущностей с экосимуляцией + фрактальные шейдеры перегружают WebGL/JS | Средняя | Высокое | Web Workers для симуляции. Spatial partitioning. Culling невидимых сущностей. Если не хватит — вынос тяжёлой логики в WASM (Rust → wasm-pack) |
|
||
| **Phaser 3 — проект одного разработчика** (bus factor) | Низкая | Среднее | Phaser 3 стабилен и feature-complete. При необходимости — миграция рендера на Pixi.js, ECS-логика не затронута |
|
||
| **Веб-стек не годится для консолей** | Средняя | Среднее | Electron/Tauri для десктопа. Для Switch — потребуется порт (возможно, на этом этапе Godot с импортом логики) |
|
||
| **Масштаб химической системы** (2000 реакций) нагружает runtime | Низкая | Среднее | Реакции — табличный lookup (O(1)), не симуляция. База в JSON, индексация по реагентам. Узкое место — UI поиска, не вычисления |
|
||
| **IndexedDB/localStorage — потолок для мета-прогрессии** | Низкая | Низкое | IndexedDB вмещает сотни MB. Для «Синтеза» достаточно. При необходимости — экспорт в файл |
|