> ## 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.

# Classements

> Recréez les classements Steam sur le GDK XBOX à l'aide des statistiques basées sur les événements et des règles de statistiques de Partner Center, avec des exemples de code comparant les deux API de classement.

Les classements des XBOX services sont dérivés des statistiques des utilisateurs et construits à partir de requêtes. Cela diffère des classements de Steam, qui reposent sur des « scores » chargés vers l'API. Comme pour les succès, le Microsoft Game Development Kit (GDK) XBOX dispose de deux API pour les statistiques : basée sur les événements et gérée par le titre. Contrairement aux succès, nous vous recommandons d'utiliser les statistiques et classements basés sur les événements plutôt que ceux gérés par le titre. Cette rubrique se concentre sur cette API. Pour plus d'informations sur les différences entre ces deux API, consultez [Statistiques basées sur les événements et statistiques gérées par le titre](/fr/services/xbox-services/player-data/stats-leaderboards/index).

Les deux plateformes définissent les classements sur leurs portails. La différence est que les XBOX services vous demandent d'abord de définir une règle de statistique dans Partner Center, puis de créer un classement basé sur la statistique alimentée par cette règle. Steam, en revanche, ne fait pas de distinction entre les deux : vous créez un classement dans leur portail ou par programmation, puis vous chargez directement les scores des utilisateurs dans ce classement.

Pour illustrer comment chacune de ces API peut être utilisée par rapport à l'API Steam Leaderboard, des exemples de code montrent comment créer un classement de la plus grande distance parcourue (l'exemple provient de la documentation de l'API Steamworks) avec le SDK Steam et avec la plateforme de statistiques basées sur les événements du Microsoft Game Development Kit (GDK) XBOX. Les sections suivantes décrivent la logique.

## Création d'une statistique/d'un classement dans le portail

### Steamworks

Dans le portail d'administration Steamworks, accédez à **Stats & Achievements** > **Leaderboards**. Remplissez le formulaire comme indiqué dans la capture d'écran suivante (issue de la documentation Steamworks).

<img src="https://mintcdn.com/microsoft-4404708b/5IpvKlT-jmAaVkeY/images/nda/steam-porting-guide/steam-portal-add-leaderboard.png?fit=max&auto=format&n=5IpvKlT-jmAaVkeY&q=85&s=e8a3f4a76f8a9bdc60689571bf5a9dbb" alt="Capture d'écran du formulaire utilisé pour créer un classement dans le portail d'administration Steamworks" width="806" height="190" data-path="images/nda/steam-porting-guide/steam-portal-add-leaderboard.png" />

### Microsoft Game Development Kit (GDK) XBOX (basé sur les événements)

Dans Partner Center, accédez à votre jeu et sélectionnez **XBOX services** > **Gameplay settings**. Dans la barre de navigation du volet droit, sélectionnez **Player Stats** > **Stat Rules** et ajoutez une règle de statistique en tant que **Show**, en la configurant selon les besoins de votre statistique. Comme nos mises à jour de statistiques incluront une valeur calculée de la distance parcourue par le joueur (l'utilisateur) depuis la dernière mise à jour, nous spécifions un champ de mesure dans lequel le service obtiendra cette valeur.

<Note>
  Il n'y a aucune différence fonctionnelle selon que vous stockez les données de mise à jour d'un événement dans le champ Measurements ou Dimensions de l'événement. Ces deux champs existent pour être utilisés avec Application Insights. Pour plus d'informations à ce sujet, consultez \[API Application Insights pour les événements et
</Note>

métriques personnalisés]\([https://learn.microsoft.com/en-us/azure/azure-monitor/app/api-custom-events-metrics](https://learn.microsoft.com/en-us/azure/azure-monitor/app/api-custom-events-metrics)).

La capture d'écran suivante montre le formulaire utilisé pour créer une règle de statistique dans Partner Center.

<img src="https://mintcdn.com/microsoft-4404708b/5IpvKlT-jmAaVkeY/images/nda/steam-porting-guide/partner-center-stat-rule.png?fit=max&auto=format&n=5IpvKlT-jmAaVkeY&q=85&s=08b05f51f44f9f912854674ea3c189ae" alt="Capture d'écran du formulaire utilisé pour créer une règle de statistique dans Partner Center" width="1196" height="1046" data-path="images/nda/steam-porting-guide/partner-center-stat-rule.png" />

Après l'enregistrement, sélectionnez **Leaderboard** dans la barre supérieure du volet droit et créez un nouveau classement alimenté par la statistique que vous venez de créer, comme indiqué dans la capture d'écran suivante.

<img src="https://mintcdn.com/microsoft-4404708b/5IpvKlT-jmAaVkeY/images/nda/steam-porting-guide/partner-center-leaderboard.png?fit=max&auto=format&n=5IpvKlT-jmAaVkeY&q=85&s=5ffd10e8fdb53ed640fcb59ef31e323a" alt="Capture d'écran du formulaire utilisé pour créer un classement dans Partner Center" width="1048" height="654" data-path="images/nda/steam-porting-guide/partner-center-leaderboard.png" />

## Chargement d'un score

### Steamworks

Dans Steamworks, vous devez calculer la nouvelle valeur totale des pieds parcourus et l'envoyer à l'API à l'aide de la méthode `ISteamUserStats::UploaderLeaderboardScore`.

```cpp theme={null}
int32 newFeetTraveled; // Calculate this however you want.
const int32* scoreDetails = {}; // Extra values pertaining to the score.
SteamLeaderboard_t leaderboard; // Handle for the leaderboard to upload the score to...
SteamAPICall_t result = UploadLeaderboardScore( leaderboard, ISteamUserStats::k_ELeaderboardUploadScoreMethodForceUpdate, 100, scoreDetails, int 0);
STEAM_CALLBACK(MyGameClass, OnLeaderboardScoreUploaded, LeaderboardScoreUploaded_t);
// Handle errors in the OnLeaderboardScoreUploaded callback function.
```

### Microsoft Game Development Kit (GDK) XBOX (basé sur les événements)

Avec les statistiques basées sur les événements du Microsoft Game Development Kit (GDK) XBOX, il vous suffit de transmettre la différence de pieds parcourus à [`XblEventsWriteInGameEvent`](/fr/reference/live/xsapi-c/events_c/events_c_members), car nous avons indiqué que nous souhaitons incrémenter cette statistique à la réception d'un événement et précisé où trouver cette valeur `diff` dans la chaîne JSON des mesures, comme suit.

```cpp theme={null}
// Assume that this holds the feet that the user has traveled since the last update.
int diffFeetTraveled; 
std::stringstream ss;
ss << "{ \"feet\": " << diffFeetTraveled << " }";
std::string measurements = ss.str();
HRESULT hr = XblEventsWriteInGameEvent(
    m_xboxLiveContext,
    "FeetTraveled",
    "",
    measurements.c_str()
);
```

Pour plus d'informations, consultez [Écriture d'un événement pour alimenter une statistique basée sur les événements](/fr/services/xbox-services/player-data/stats-leaderboards/index).

## Obtention d'un classement global

Les classements globaux peuvent être récupérés avec le SDK Steamworks en appelant `ISteamUserStats::GetLeaderboardEntries`, puis en appelant `ISteamUserStats::GetDownloadedLeaderboardEntry` dans la fonction `callback` pour obtenir chaque entrée ou « ligne » du classement.

### Steamworks

```cpp theme={null}
class MyGameClass
{
    void OnFindLeaderboardCompleted(LeaderboardFindResult_t *callback);
    SteamAPICall_t m_getLoaderboardCall;
    SteamAPICall_t m_getEntriesCall;
};

m_getLoaderboardCall = SteamUserStats()->FindLeaderboard(leaderboardName);
STEAM_CALLBACK(MyGameClass, OnFindLeaderboardCompleted, LeaderboardFindResult_t);

// ...

void MyGameClass::OnFindLeaderboardCompleted(LeaderboardFindResult_t *callback)
{
    if (callback->bLeaderboardFound)
    {
        auto handle = callback->m_hSteamLeaderboard;
        const char *leaderboardName = SteamUserStats()->GetLeaderboardName(handle);
        m_getEntriesCall = SteamUserStats()->GetLeaderboardEntries(handle, ELeaderboardDataRequest::k_ELeaderboardDataRequestGlobal, 0, 100);
        STEAM_CALLBACK(MyGameClass, OnLeaderboardScoresDownloaded, LeaderboardScoresDownloaded_t);
    }
    else
    {
        // Leaderboard wasn't found.
    }

void MyGameClass::OnLeaderboardScoresDownloaded(LeaderboardScoresDownloaded_t *callback)
{
    int numScores = callback->m_cEntryCount;
    for (int i = 0; i < numScores; i++)
    {
        LeaderboardEntry_t entry;
        bool result = SteamUserStats()->GetDownloadedLeaderboardEntry(callback->m_hSteamLeaderboardEntries, i, &entry, nullptr, 0);
        if (!result)
        {
            // Handle error.
        }
        CSteamID userId = entry.m_steamIDUser;
        int32 rank = entry.m_nglobalRank;
        int32 score = entry.m_nScore;
        // Do something with the data. 
    }
}
```

### Microsoft Game Development Kit (GDK) XBOX (basé sur les événements)

Les API du Microsoft Game Development Kit (GDK) XBOX suivent un modèle similaire. Créez une requête précisant le classement souhaité, sa portée, son mode de tri, les champs supplémentaires qu'il doit contenir (le cas échéant), etc. Après avoir appelé [`XblLeaderboardGetLeaderboardAsync`](/fr/reference/live/xsapi-c/leaderboard_c/leaderboard_c_members) avec votre requête, vous pouvez utiliser [`XblLeaderboardGetLeaderboardResultSize`](/fr/reference/live/xsapi-c/leaderboard_c/leaderboard_c_members) et [`XblLeaderboardGetLeaderboardResult`](/fr/reference/live/xsapi-c/leaderboard_c/leaderboard_c_members) pour placer les résultats dans la mémoire tampon spécifiée et les parcourir, comme le montre l'exemple de code suivant.

```cpp theme={null}
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = m_taskQueue;
asyncBlock->context = nullptr;
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
    std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of the XAsyncBlock*
    size_t resultSize;
    std::vector<uint8_t> leaderboardBuffer;
    HRESULT hr = XblLeaderboardGetLeaderboardResultSize(asyncBlock, &resultSize);

    if (SUCCEEDED(hr))
    {
        leaderboardBuffer.resize(resultSize);
        XblLeaderboardResult* leaderboard{};

        hr = XblLeaderboardGetLeaderboardResult(asyncBlock, resultSize, leaderboardBuffer.data(), &leaderboard, nullptr);

        if (SUCCEEDED(hr))
        {
            // Use XblLeaderboardResult in result.
            for (int row = 0; row < leaderboard->rowsCount; row++)
            {
                uint64_t xuid = leaderboard->rows[row].xboxUserId;
                uint32_t rank = leaderboard->rows[row].rank;
                const char** values = leaderboard->rows[row].columnValues;
                // Do something with the data.
            }
        }
    }
};

XblLeaderboardQuery leaderboardQuery = {}; 
strcpy(&leaderboardQuery.scid[0], m_scid.c_str());
leaderboardQuery.leaderboardName = leaderboardName.c_str(); 
leaderboardQuery.xboxUserId = 0;
leaderboardQuery.order = XblLeaderboardSortOrder::Descending;
leaderboardQuery.skipResultToRank = 0;
leaderboardQuery.maxItems = 100;
leaderboardQuery.statName = "MyStatName";
leaderboardQuery.socialGroup = XblLeaderboardQueryType::None;
// See the link as follows for more options in XblLeaderboardQuery.

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

Pour plus d'informations, consultez les ressources suivantes :

* [Exemple de code pour les classements basés sur les événements](/fr/services/xbox-services/player-data/stats-leaderboards/index)
* [XblLeaderboardQuery](/fr/reference/live/xsapi-c/leaderboard_c/leaderboard_c_members)

## Obtention d'un classement social

Dans Steamworks, vous pouvez utiliser l'énumération `ELeaderboardDataRequest::k_ELeaderboardDataRequestFriends` pour limiter le classement aux amis de l'utilisateur actuel.

Dans le Microsoft Game Development Kit (GDK) XBOX, on parle de *classement social*. Pour obtenir un classement social auprès des XBOX services, définissez `xboxIUserId` sur l'ID d'utilisateur XBOX (XUID) de l'utilisateur actuellement connecté aux XBOX services, `leaderboardName` sur `nullptr` et `socialGroup` sur `XblSocialGroupType::People` ou `XblSocialGroupType::Favorites` dans votre structure [`XblLeaderboardQuery`](/fr/reference/live/xsapi-c/leaderboard_c/leaderboard_c_members). Appelez `XblLeaderboardGetLeaderboardAsync` comme indiqué précédemment.

Pour plus d'informations, consultez [XblSocialGroupType](/fr/reference/live/xsapi-c/leaderboard_c/leaderboard_c_members).

## Statistiques mises en avant

Outre les statistiques utilisateur habituelles utilisées pour générer des classements de type Steam, les XBOX services proposent un concept supplémentaire appelé *Featured Stats* (statistiques mises en avant). Les Featured Stats apparaissent sur plusieurs surfaces de l'écosystème XBOX pour votre jeu et peuvent afficher les valeurs des statistiques des utilisateurs ou des classements déjà générés. Vous pouvez créer jusqu'à 20 Featured Stats pour votre jeu.

Pour plus d'informations sur les Featured Stats et sur la façon de les ajouter, consultez [Vue d'ensemble des Featured Stats](/fr/services/xbox-services/player-data/stats-leaderboards/index) et [Configuration dans le portail des Featured Stats basées sur les événements](/fr/services/xbox-services/player-data/stats-leaderboards/index).

## Limitation du débit

Lorsque vous écrivez des événements, veillez à ne pas solliciter trop souvent l'API XBOX Services (XSAPI), car votre jeu risquerait d'atteindre sa limite de débit. Cela peut entraîner un comportement inattendu et une mauvaise expérience pour vos utilisateurs. Notez qu'il s'agit d'une préoccupation propre aux XBOX services qui ne se pose pas sur Steam. L'écriture de valeurs de statistiques sur Steam ne déclenche pas d'appel d'API au serveur tant que votre jeu ne les synchronise pas explicitement.

Pour les événements fréquents, essayez de regrouper les appels d'API afin qu'ils soient déclenchés après un certain nombre d'événements, ou d'effectuer la mise à jour sur le serveur à un intervalle de temps donné.

Vous pouvez déboguer vos appels d'API à l'aide de l'[XBOX Live Trace Analyzer (XblTraceAnalyzer.exe)](/fr/tools/tools-services/live-trace-analyzer).

Pour plus d'informations sur la limitation du débit dans les XBOX services, consultez [Limitation de débit précise](/fr/services/xbox-services/develop/best-practices/live-fine-grained-rate-limiting).


## Related topics

- [Classements saisonniers](/fr/services/playfab/community/leaderboards/seasonal-leaderboards.md)
- [Quotas des classements](/fr/services/playfab/community/leaderboards/quota-leaderboards.md)
- [Limites des classements](/fr/services/playfab/community/leaderboards/limits-leaderboards.md)
- [Classements de groupes](/fr/services/playfab/community/leaderboards/group-leaderboards.md)
- [Classements à niveaux manuels](/fr/services/playfab/community/leaderboards/manual-tiers.md)
