> For the complete documentation index, see [llms.txt](https://docs.allout.game/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.allout.game/all-out-docs/ru/osnovnye-koncepcii-dvizhka/camera-and-post-processing.md).

# Камера и постобработка

### Камера

Каждый игрок начинает с камеры, которая следует за ним во время движения. Чтобы изменить масштаб или переместить камеру в другие места, мы предоставляем набор API.

В CSL камера — это структура для каждого игрока в `Игрок`:

* **`camera.follow_player: bool`**: когда `true`, движок удерживает камеру, следуя за игроком.
* **`camera.position: v2`**: центр камеры в мировом пространстве (используется, когда `follow_player = false`).
* **`camera.size: float`**: величина увеличения. **Больше = сильнее отдаление** (вы видите больше мира).

Состояние компонента игрока синхронизируется, поэтому задавайте поля камеры в `ao_late_update` за `is_local_or_server()`:

```go
import "core:ao"

My_Player :: class : Player_Base {
    ao_late_update :: method(dt: float) {
        if is_local_or_server() {
            // Простое увеличение «задал и забыл»
            camera.size = 7.0;
        }
    }
}
```

#### Пользовательское следование (смещение + сглаживание)

Если вам нужны смещения камеры, катсцены или собственное сглаживание, отключите `follow_player` и управляйте `camera.position` сами:

```go
import "core:ao"

My_Player :: class : Player_Base {
    ao_late_update :: method(dt: float) {
        if !is_local_or_server() return;

        camera.follow_player = false;

        // Следовать чуть выше игрока
        target_pos := entity.world_position + v2{0, 0.5};

        // Плавно двигаться к цели (безопасно для dt)
        t := clamp(dt * 10.0, 0.0, 1.0);
        camera.position = lerp(camera.position, target_pos, t);

        // Плавное увеличение
        target_size := 6.0;
        camera.size = lerp(camera.size, target_size, t);
    }
}
```

Рендерер интерполирует `position` и `size` между кадрами симуляции. Их предыдущие значения только для чтения доступны как `position_last_frame` и `size_last_frame`.

Камера также предоставляет `is_visible` перегрузки для точки, `Rect`, `Sprite_Renderer`, или `Spine_Animator`. Необязательный `апрон` аргумент расширяет видимую область.

### Постобработка

Постобработка позволяет применять к вашей камере визуальные эффекты, такие как искажение, цветокоррекция и другие, чтобы сделать вашу игру ярче!

Вы можете настроить постобработку двумя способами:

* **Настроить в редакторе**: задайте стек постобработки по умолчанию через **Edit → Game Config → Post Processing**. Это применяется при использовании поведения камеры по умолчанию.
* **Настроить во время выполнения через CSL**: используйте `Post_Processing` API, чтобы динамически применять эффекты из метода вашего игрока. `ao_late_update` Если вы включите любой эффект, All Out автоматически будет использовать HDR-пайплайн.

API постобработки CSL

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

функция, она `Post_Processing` переопределяет **значения по умолчанию из редактора для этого кадра — поэтому вы должны вызывать каждый эффект, который хотите сделать активным.** Функция

| Функция                                | Структура конфигурации        | Поля                                                       |
| -------------------------------------- | ----------------------------- | ---------------------------------------------------------- |
| `Post_Processing.bloom`                | `Bloom_Config`                | `bloom_amount: float`                                      |
| `Post_Processing.color_grade`          | `Color_Grade_Config`          | `color_filter: v3`, `saturation: float`, `contrast: float` |
| `Post_Processing.chromatic_aberration` | `Chromatic_Aberration_Config` | `channel_offsets: v3`, `focal_point: v2`                   |
| `Post_Processing.blur`                 | `Blur_Config`                 | `directions: float`, `quality: float`, `size: float`       |
| `Post_Processing.film_grain`           | `Film_Grain_Config`           | `strength: float`, `noise_scale: float`                    |
| `Post_Processing.vignette`             | `Vignette_Config`             | `radius: float`, `softness: float`                         |

Оставляйте эти вызовы вместе, чтобы несколько компонентов не конкурировали за общесценную конфигурацию:

```go
import "core:ao"

My_Player :: class : Player_Base {
    ao_late_update :: method(dt: float) {
        if !is_local_or_server() return;

        // Применять bloom + vignette каждый кадр
        Post_Processing.bloom({bloom_amount = 0.04});
        Post_Processing.vignette({radius = 0.8, softness = 0.4});
    }
}
```

Чтобы вернуться к значениям редактора по умолчанию, перестаньте вызывать каждую `Post_Processing` функцию.
