| .. | |||
| README.md | 12 hours ago | ||
| agent.md | 11 hours ago | ||
| art-pipeline.md | 17 hours ago | ||
| assets-audio-save.md | 17 hours ago | ||
| core.md | 17 hours ago | ||
| cutscene.md | 13 hours ago | ||
| getting-started.md | 17 hours ago | ||
| input.md | 15 hours ago | ||
| maps.md | 14 hours ago | ||
| practices.md | 11 hours ago | ||
| recipes.md | 14 hours ago | ||
| render.md | 14 hours ago | ||
| ui-and-dialogue.md | 14 hours ago | ||
Движок — переиспользуемая основа для 2D-пиксельных игр в браузере. Первая игра на нём — «Пепельные луга» (apps/game), она же живой пример использования всех API.
| Файл | О чём |
|---|---|
| getting-started.md | Новая игра с нуля: bootstrap, сцены, ассеты |
| core.md | Engine, GameLoop, EventBus, Tween, GameState, StateMachine, Settings |
| render.md | Renderer, pixel-perfect, камера, IsoDepthLayer, частицы |
| input.md | Действия, клавиатура, мышь/тач, геймпад, виртуальный джойстик |
| maps.md | Изометрия, A*, формат карт, импорт из Tiled |
| ui-and-dialogue.md | UI-кит, PixelText, диалоговые графы |
| cutscene.md | CutsceneRunner: кат-сцены из шагов |
| assets-audio-save.md | AssetLoader, атласы, AudioManager, сейвы |
| art-pipeline.md | Генератор пиксель-арта, палитра, замена на рисованный арт |
| recipes.md | «Как сделать…»: готовые решения типовых задач |
| agent.md | Агентный мост: EngineAgent, window.__agent, инварианты, tools/agent.mjs |
| practices.md | Живой документ практик агента «по ситуациям» — пополняется в каждом коммите |
Игра импортирует движок только через @rpg/engine (весь API реэкспортирован из packages/engine/src/index.ts). Прямые импорты pixi.js в игре — нарушение границы: нужные типы реэкспортируются движком (Container, Graphics, Text, Sprite, Texture). Это позволяет менять внутренности движка, не трогая игры.
Логика обновляется фиксированным шагом 60 Гц (GameLoop, аккумулятор, максимум 5 шагов за кадр). dt в Scene.update всегда одинаковый — физика и таймеры детерминированы. Рендер происходит после каждого шага.
image-rendering: pixelated, roundPixels: true).computeScale); UI, текст (VT323) и все display-эффекты живут в нём.px = units·tileW, 32 px/юнит).В packages/engine нет ни одного упоминания контента конкретной игры: GameState — механика флагов и переменных, DialogueRunner — механика графов. Всё содержимое (тексты, флаги сюжета, карты) живёт в приложении.
Всё, что зависит от браузера, инъецируется или изолируется: StorageLike для сейвов, resolveUrl для ассетов, parent для канваса. Чистые модули (математика, A*, диалоги, формат карт) тестируются в Node без браузера — Vitest.
packages/engine/src/ core/ Engine, GameLoop, EventBus, Tween+easing, GameState, StateMachine, Settings scene/ SceneManager (стек сцен + fade-переходы) render/ Renderer, Camera, IsoDepthLayer, Particles, computeScale input/ InputManager (клавиатура/мышь/тач/геймпад), VirtualJoystick map/ IsometricTileMap, pathfinding (A*), mapFormat (JSON+RLE), tiled-импортёр math/ Vec2, изометрия, seeded RNG dialogue/ DialogueRunner (графы диалогов, view-агностик) cutscene/ CutsceneRunner (кат-сцены из шагов, view-агностик) ui/ DialogueBox, Panel, Button, MenuList, PixelText anim/ FrameAnimation audio/ AudioManager (шины master/music/sfx, кроссфейд) assets/ AssetLoader (текстуры, атласы) save/ SaveManager (JSON-слоты) agent/ EngineAgent, SceneAgent, инварианты (агентный мост) ecs/ World/createEntity/query/addSystem debug/ DebugOverlay
Подробности — в корневом CLAUDE.md; краткий список:
Assets.load без предварительного Assets.init({}) висит навсегда без ошибок — AssetLoader делает это сам, но если грузите напрямую через Pixi, не забудьте.app.renderer недоступен до завершения app.init() — Renderer.setup() это учитывает.map.worldBounds), клэмп через проекцию считает это сам.document.fonts — шрифт загружается асинхронно; ensurePixelFont() вызывается до создания текста, но фолбэк monospace всегда безопасен.