feat(render): псевдо-3D, всегда видимые двери, ассеты+эффекты, русификация
- Рендер переведён в псевдо-3D: наклонная PerspectiveCamera, пол лежит плашмя, персонажи/враги — вертикальные спрайты-биллборды, стены с высотой. Починен баг: пол создавался без поворота и стоял вертикально → «вывернутая» перспектива. - Двери видны всегда: закрыты (засов) во время боя, открытый проём после зачистки. - render/assets.ts: процедурные текстуры (спрайты персонажей/врагов, пол, стены, двери, снаряд, тень) + эффекты оружия (вспышка из дула, искры, облачко гибели). - Светлее палитра — исправлено «тёмное на тёмном». - Игра переименована в «Биндим Фигняшку»; полная русификация UI (ДАЛЬНИЙ/БЛИЖНИЙ, ИГРА ОКОНЧЕНА, ПОБЕДА); клавиши-подсказки оставлены латиницей. - Ввод по event.code → WASD/Q/R работают в любой раскладке (вкл. русскую). - theme.ts урезан до реально используемых тинтов (bg/swing/flash). - docs/ASSET_BRIEF.md — бриф и промпт на полную художку; доки синхронизированы. - Ядро (src/core) не тронуто — раунд чисто render/UI. 27 тестов + типы зелёные. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+18
-8
@@ -28,8 +28,10 @@
|
||||
```
|
||||
3. **`src/core/systems/spawner.ts`** — реши, когда он спавнится (логика выбора типа
|
||||
в начале цикла). Напр. с шансом: `rng.chance(0.15) ? 'tank' : rng.chance(ENEMY.fastChance) ? 'fast' : 'normal'`.
|
||||
4. **`src/render/ThreeRenderer.ts`** — цвет в `COLOR` и выбор цвета/геометрии в
|
||||
`syncEnemies` (квадрат `unitPlane` или круг `unitCircle`).
|
||||
4. **`src/render/assets.ts`** — добавь ключ в `SpriteKey` и ветку в `Assets.sprite()`
|
||||
(рисуется через `drawCharacter(...)` с твоими цветами).
|
||||
5. **`src/render/ThreeRenderer.ts`** — добавь строку в `enemyMatKey`, сопоставив новый
|
||||
`Enemy['type']` этому `SpriteKey` (без этого не пройдёт проверка типов).
|
||||
|
||||
ИИ, урон, отбрасывание, мигание при попадании — общие, их трогать не нужно.
|
||||
Добавь тест в `tests/spawner.test.ts`, если ввёл особое правило спавна.
|
||||
@@ -111,9 +113,16 @@
|
||||
|
||||
---
|
||||
|
||||
## 8. Кастомные ассеты (своя тема / текстуры)
|
||||
## 8. Кастомные ассеты (спрайты, текстуры, тема)
|
||||
|
||||
Сейчас вид мира — это цвета в **`src/render/theme.ts`** (`Theme` + `DEFAULT_THEME`).
|
||||
Графика (спрайты персонажей/врагов, пол, стены, двери, снаряд, эффекты, тень) рисуется
|
||||
процедурно в **`src/render/assets.ts`** (класс `Assets`, кэширует текстуры three.js).
|
||||
|
||||
- **Свои PNG вместо процедурных:** замени тело нужного `drawX()` на загрузку картинки
|
||||
`new THREE.TextureLoader().load(url)` и верни её из соответствующего геттера — рендер
|
||||
берёт текстуры по ключам, больше ничего менять не нужно. Полный список нужных ассетов с
|
||||
размерами и готовый промпт для дизайн-ИИ — в **`docs/ASSET_BRIEF.md`**.
|
||||
- **Цвета/тинты/фон** (не текстуры) — в **`src/render/theme.ts`** (`Theme` + `DEFAULT_THEME`).
|
||||
|
||||
- **Своя палитра:** сделай ещё один объект `Theme` и передай его в
|
||||
`new ThreeRenderer(canvas, myTheme)` в `main.ts`. Сейчас рендер создаётся один
|
||||
@@ -133,10 +142,11 @@
|
||||
Рендер изолирован за интерфейсом **`src/render/Renderer.ts`** (`render(game, alpha)`
|
||||
+ `dispose()`). Варианты:
|
||||
|
||||
- **Доработать вид** (спрайты, текстуры, частицы) — внутри `ThreeRenderer`.
|
||||
- **Сделать 3D** — поменяй `OrthographicCamera` на `PerspectiveCamera`, добавь
|
||||
свет и 3D-меши. Мир рисуется по тем же координатам сущностей из `Game` — логику
|
||||
менять не нужно.
|
||||
- **Доработать вид** (спрайты, текстуры, частицы) — внутри `ThreeRenderer` (камера
|
||||
уже наклонная `PerspectiveCamera`, сущности — биллборд-спрайты).
|
||||
- **Усилить 3D** — для настоящего объёма замени `MeshBasicMaterial` (он без света)
|
||||
на `MeshStandardMaterial`, добавь источники света и объёмные меши вместо плоскостей.
|
||||
Мир рисуется по тем же координатам сущностей из `Game` — логику менять не нужно.
|
||||
- **Другой рендер целиком** (например, Canvas2D для отладки) — реализуй `Renderer`
|
||||
и подставь в `main.ts`. Ядро не трогается вообще.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user