> ## 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 XBOX GDK à l'aide de statistiques basées sur les événements et de règles de statistiques 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 au moyen de requêtes. Cela diffère des classements de Steam, qui reposent sur des « scores » téléversés vers l'API. Comme pour les succès, le Microsoft Game Development Kit (GDK) XBOX dispose de deux API pour les statistiques : basées sur les événements et gérées par le titre. Contrairement aux succès, nous vous recommandons d'utiliser les statistiques et les classements basés sur les événements plutôt que ceux gérés par le titre. Cette rubrique porte sur cette API. Pour plus d'information sur les différences entre ces deux API, consultez [Statistiques basées sur les événements et gérées par le titre](/fr-CA/services/xbox-services/player-data/stats-leaderboards/index).

Les deux plateformes définissent les classements dans 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 fondé 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 son portail ou par programmation, puis vous téléversez les scores des utilisateurs directement dans ce classement.

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

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

### Steamworks

Dans le portail d'administration Steamworks, accédez à **Stats & Achievements** > **Leaderboards**. Remplissez le formulaire comme illustré dans la capture d'écran suivante (tirée 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" />

### XBOX Game Development Kit (GDK) (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. Puisque nos mises à jour de statistique incluront une valeur calculée de la distance parcourue par le joueur (utilisateur) depuis la dernière mise à jour, nous allons spécifier un champ de mesure duquel 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'information à ce sujet, consultez \[API Application Insights pour les événements et
</Note>

les 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 illustré 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" />

## Téléversement 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.
```

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

Avec les statistiques basées sur les événements du XBOX Game Development Kit (GDK), il vous suffit de transmettre la différence de pieds parcourus à [`XblEventsWriteInGameEvent`](/fr-CA/reference/live/xsapi-c/events_c/events_c_members), car nous avons spécifié que nous voulons incrémenter cette statistique à la réception d'un événement et nous avons indiqué 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'information, consultez [Écriture d'un événement pour alimenter une statistique basée sur les événements](/fr-CA/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 « rangée » 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. 
    }
}
```

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

Les API du XBOX Game Development Kit (GDK) suivent un modèle similaire. Construisez une requête spécifiant le classement voulu, la portée qu'il doit couvrir, la manière de le trier, les champs supplémentaires qu'il doit contenir (le cas échéant), et plus encore. Après avoir appelé [`XblLeaderboardGetLeaderboardAsync`](/fr-CA/reference/live/xsapi-c/leaderboard_c/leaderboard_c_members) avec votre requête, vous pouvez utiliser [`XblLeaderboardGetLeaderboardResultSize`](/fr-CA/reference/live/xsapi-c/leaderboard_c/leaderboard_c_members) et [`XblLeaderboardGetLeaderboardResult`](/fr-CA/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 illustré dans 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'information, consultez les ressources suivantes :

* [Exemple de code pour les classements basés sur les événements](/fr-CA/services/xbox-services/player-data/stats-leaderboards/index)
* [XblLeaderboardQuery](/fr-CA/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 la portée du classement aux amis de l'utilisateur actuel.

Dans le XBOX Game Development Kit (GDK), cela s'appelle un *classement social*. Pour obtenir un classement social à partir des XBOXBOX services, définissez `xboxIUserId` sur l'ID 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-CA/reference/live/xsapi-c/leaderboard_c/leaderboard_c_members). Appelez `XblLeaderboardGetLeaderboardAsync` comme illustré précédemment.

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

## Statistiques en vedette

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

Pour plus d'information sur les statistiques en vedette et sur la façon de les ajouter, consultez [Vue d'ensemble des statistiques en vedette](/fr-CA/services/xbox-services/player-data/stats-leaderboards/index) et [Configuration dans le portail des statistiques en vedette basées sur les événements](/fr-CA/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 risque 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 pose pas de problème sur Steam. Sur Steam, l'écriture de valeurs de statistiques n'entraîne aucun 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 que la mise à jour sur le serveur se fasse à un intervalle de temps donné.

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

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


## Related topics

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