> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Actualización de logros administrados por el título

> Código de ejemplo de XSAPI que muestra cómo desbloquear un logro de XBOX Live administrado por el título o notificar el progreso de finalización con XblAchievementsUpdateAchievementAsync.

<a id="top" />

En este tema se tratan los siguientes puntos:

* [Desbloqueo de un logro](#unlocking-an-achievement)
* [Actualización del progreso de finalización de un logro](#updating-an-achievement)

<a id="unlocking-an-achievement" />

## Desbloqueo de un logro

Después de configurar los logros mediante Partner Center y publicarlos en su sandbox de desarrollo, su título puede desbloquearlos llamando a la API [XblAchievementsUpdateAchievementAsync](/reference/live/xsapi-c/achievements_c/functions/xblachievementsupdateachievementasync).
Para obtener más información, consulte el código de ejemplo de la sección siguiente.

Para desbloquear un logro, establezca `percentComplete` en 100.
Si el usuario está en línea, la solicitud se envía inmediatamente al servicio de logros de los servicios XBOX y desencadena las siguientes experiencias de usuario.

* El usuario recibe una notificación de logro desbloqueado.
* El logro especificado aparece como desbloqueado en la lista de logros del usuario para el título.
* El logro desbloqueado se agrega a la fuente de actividades del usuario.

<Note>La experiencia de usuario es visualmente la misma para los logros que usan logros basados en eventos o logros administrados por el título.</Note>

Si el usuario está sin conexión, la solicitud de desbloqueo se pone en cola localmente en el dispositivo del usuario.
Cuando se restablece la conectividad de red, la solicitud se envía automáticamente al servicio de logros (no se requiere ninguna acción del juego para desencadenar esto) y se producen las experiencias de usuario anteriores tal como se describe.

<a id="updating-an-achievement" />

## Actualización del progreso de finalización de un logro

Para actualizar el progreso de un usuario hacia el desbloqueo de un logro, llame a [XblAchievementsUpdateAchievementAsync](/reference/live/xsapi-c/achievements_c/functions/xblachievementsupdateachievementasync). Establezca el argumento `percentComplete` en un número entero entre 1 y 100.
Para obtener más información, consulte el siguiente código de ejemplo.

El progreso de un logro solo puede aumentar.
Si `percentComplete` se establece en un número menor que el último valor de `percentComplete` del logro, la actualización se ignora.
Por ejemplo, si el `percentComplete` del logro se había establecido previamente en 75, el envío de una actualización con un valor de 25 se ignora. El logro se sigue mostrando como completado al 75 por ciento.

Si `percentComplete` se establece en 100, el logro se desbloquea.

Si `percentComplete` se establece en un número mayor que 100, la API se comporta como si hubiera establecido el número exactamente en 100.

### Actualización de logros para el título actual

Puede actualizar los logros del título actual llamando a [XblAchievementsUpdateAchievementAsync](/reference/live/xsapi-c/achievements_c/functions/xblachievementsupdateachievementasync), como se muestra a continuación.

**API de C plana**

```cpp theme={null}
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = queue;
asyncBlock->context = nullptr;
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
    std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of the XAsyncBlock*.
    auto result = XAsyncGetStatus(asyncBlock, false);
    if (SUCCEEDED(result))
    {
        // The achievement was updated.
    }
    else if (result == HTTP_E_STATUS_NOT_MODIFIED)
    {
        // The achievement wasn't updated.
    }
    else
    {
        // The achievement failed to update.
    }
};

HRESULT hr = XblAchievementsUpdateAchievementAsync(
    xboxLiveContext,
    xboxUserId,
    achievementId.c_str(),
    percentComplete,
    asyncBlock.get()
);
if (SUCCEEDED(hr))
{
    // The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* because the callback will take over ownership.
    // If the call fails, std::unique_ptr will keep ownership and delete XAsyncBlock*.
    asyncBlock.release();
}
```

Para obtener más información, consulte lo siguiente:

* [XAsyncBlock](/reference/system/xasync/structs/xasyncblock)
* [XAsyncGetStatus](/reference/system/xasync/functions/xasyncgetstatus)
* [XblAchievementsUpdateAchievementAsync](/reference/live/xsapi-c/achievements_c/functions/xblachievementsupdateachievementasync)

### Actualización de logros para un título diferente

Puede actualizar los logros de otro `titleId` usando [XblAchievementsUpdateAchievementForTitleIdAsync](/reference/live/xsapi-c/achievements_c/functions/xblachievementsupdateachievementfortitleidasync), como se muestra a continuación.

**API de C plana**

```cpp theme={null}
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = queue;
asyncBlock->context = nullptr;
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
    std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of the XAsyncBlock*.
    auto result = XAsyncGetStatus(asyncBlock, false);
    if (SUCCEEDED(result))
    {
        // The achievement was updated.
    }
    else if (result == HTTP_E_STATUS_NOT_MODIFIED)
    {
        // The achievement wasn't updated.
    }
    else
    {
        // The achievement failed to update.
    }
};

HRESULT hr = XblAchievementsUpdateAchievementForTitleIdAsync(
    xboxLiveContext,
    xboxUserId,
    titleId,
    scid,
    achievementId.c_str(),
    percentComplete,
    asyncBlock.get()
);
if (SUCCEEDED(hr))
{
    // The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* because the callback will take over ownership.
    // If the call fails, std::unique_ptr will keep ownership and delete XAsyncBlock*.
    asyncBlock.release();
}
```

Para obtener más información, consulte lo siguiente:

* [XAsyncBlock](/reference/system/xasync/structs/xasyncblock)
* [XAsyncGetStatus](/reference/system/xasync/functions/xasyncgetstatus)
* [XblAchievementsUpdateAchievementForTitleIdAsync](/reference/live/xsapi-c/achievements_c/functions/xblachievementsupdateachievementfortitleidasync)

[Volver al principio de este tema.](#top)


## Related topics

- [Código de ejemplo de logros administrados por el título](/es/services/xbox-services/player-data/achievements/title-managed/how-to/live-achievements-howto-nav.md)
- [Estadísticas y logros](/es/build/steam-porting-guide/features/stats-and-achievements.md)
- [Procedimientos](/es/services/xbox-services/player-data/achievements/title-managed/how-to/index.md)
- [Integración del GDK con un proyecto de Unreal Engine anterior a la versión 4.26](/es/build/gdk-and-engines/unreal/unreal-legacy.md)
- [Logros administrados por el título](/es/services/xbox-services/player-data/achievements/title-managed/live-achievements-tm-nav.md)
