> 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/docs-es/conceptos-basicos-del-motor/camera-and-post-processing.md).

# Cámara y posprocesamiento

### Cámara

Cada jugador comienza con una cámara que lo sigue mientras se mueve. Para ajustar el zoom o mover la cámara a otros lugares, proporcionamos un conjunto de API.

En CSL, la cámara es una estructura por jugador en `Jugador`:

* **`camera.follow_player: bool`**: cuando `true`, el motor mantiene la cámara siguiendo al jugador.
* **`camera.position: v2`**: el centro de la cámara en el espacio del mundo (se usa cuando `follow_player = false`).
* **`camera.size: float`**: cantidad de zoom. **Más grande = más alejado** (ves más del mundo).

El estado del componente Player se sincroniza, así que establece los campos de la cámara en el `ao_late_update` detrás `is_local_or_server()`:

```go
import "core:ao"

My_Player :: class : Player_Base {
    ao_late_update :: method(dt: float) {
        if is_local_or_server() {
            // Zoom simple de "configurar y olvidar"
            camera.size = 7.0;
        }
    }
}
```

#### Seguimiento personalizado (desplazamiento + suavizado)

Si quieres desplazamientos de cámara, cinemáticas o suavizado personalizado, desactiva `follow_player` y controla `camera.position` tú mismo:

```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;

        // Sigue ligeramente por encima del jugador
        target_pos := entity.world_position + v2{0, 0.5};

        // Muévete suavemente hacia el objetivo (seguro con dt)
        t := clamp(dt * 10.0, 0.0, 1.0);
        camera.position = lerp(camera.position, target_pos, t);

        // Zoom suave
        target_size := 6.0;
        camera.size = lerp(camera.size, target_size, t);
    }
}
```

El renderizador interpola `posición` y `tamaño` entre fotogramas de simulación. Sus valores anteriores de solo lectura están disponibles como `position_last_frame` y `size_last_frame`.

La cámara también proporciona `is_visible` sobrecargas para un punto, `Rect`, `Sprite_Renderer`, o `Spine_Animator`. El `margen` argumento opcional amplía el área visible.

### Posprocesamiento

El posprocesamiento te permite aplicar efectos visuales a tu cámara, como distorsión, gradación de color y otros efectos, ¡para que tu juego destaque!

Puedes configurar el posprocesamiento de dos maneras:

* **Configúralo en el editor**: configura la pila predeterminada de posprocesamiento mediante **Editar → Configuración del juego → Posprocesamiento**. Esto se aplica al usar el comportamiento predeterminado de la cámara.
* **Configúralo en tiempo de ejecución mediante CSL**: usa la `Post_Processing` API para aplicar dinámicamente efectos desde el `ao_late_update` método de tu jugador.

Si habilitas cualquier efecto, All Out usará automáticamente la canalización HDR.

#### API de posprocesamiento de CSL

Llama a cualquiera de las siguientes funciones en cada fotograma para aplicar efectos de posprocesamiento. Cuando se llama a cualquier `Post_Processing` función, esta **anula** los valores predeterminados del editor para ese fotograma, así que debes llamar a cada efecto que quieras activo.

| Función                                | Estructura de configuración   | Campos                                                     |
| -------------------------------------- | ----------------------------- | ---------------------------------------------------------- |
| `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`                         |

Mantén estas llamadas juntas para que varios componentes no compitan por la configuración global de la escena:

```go
import "core:ao"

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

        // Aplica bloom + viñeta en cada fotograma
        Post_Processing.bloom({bloom_amount = 0.04});
        Post_Processing.vignette({radius = 0.8, softness = 0.4});
    }
}
```

Para volver a los valores predeterminados del editor, deja de llamar a cada `Post_Processing` función.
