GameMaker Studio · GML
Classements globaux
Creer des Classements
Depuis le tableau de bord, ouvrez la section Classements et creez une table en lui donnant un nom. Vous pouvez declarer jusqu'a 10 tables par jeu.
Parametres du Classement
Une fois cree, configurez :
- Ordre : descendant ou ascendant.
- Scores a afficher : nombre de lignes retournees.
- Score min/max : limites optionnelles ; les envois hors limites sont rejetes.
- Champs personnalises : donnees supplementaires par score (niveau, pays, etc.), jusqu'a 20 selon votre plan.
- Scores temporels : classements quotidien/hebdomadaire/mensuel. Desactive = table historique uniquement ; un envoi qui ne depasse pas le meilleur score n'enregistre rien.
Sauvegardez chaque cle de table ; vous les passez a gmda_setLeaderboard dans le controleur.
Tables Multiples (base 1)
Declarez toutes vos tables ensemble. L'ordre definit le numero de table en base 1 que vous passez a chaque autre appel. La premiere cle est la table 1.
gmda_setLeaderboard("key_1", "key_2", "key_3");
// key_1 -> table 1, key_2 -> table 2, key_3 -> table 3Soumettre des Scores
Soumettez un score a une table par son numero en base 1, avec une struct optionnelle de champs personnalises, puis lisez submit_completed dans la file.
if (gmda_status()) {
gmda_submit(1, score, { level: level_reached }); // -> submit_completed
}
// variante securisee hors ligne : met en file + retente, survit aux fermetures de l'app
gmda_submitWithRetry(1, score, { level: level_reached });// submit_completed -> e.response:
{
"effect": "updated", // "updated" | "periods_only" | "not_improved"
"periods_enabled": true, // this table's temporal-scores toggle
"improved": true, // historic (all-time) score written
"improved_periods": { "daily": true, "weekly": true, "monthly": true },
"score": { "score": 1500, "custom_data": { "level": 3 }, "updated_at": "..." }
}gmda_submitWithRetry ne remplace un score en file que lorsque le nouveau est plus eleve. Utilisez gmda_submit pour un envoi simple sans nouvelle tentative. L'evenement submit_completed rapporte l'effet exact dans e.response.effect : "updated" (score historique ecrit), "periods_only" (seuls les classements quotidien/hebdomadaire/mensuel ont progresse) ou "not_improved" (rien n'a ete enregistre). Sur les tables avec scores temporels desactives, un score qui ne depasse pas votre meilleur en cache n'est meme pas envoye (l'appel retourne 0), consultez gmda_getTableConfig(table).
Lire les Scores
Ces getters synchrones retournent instantanement les dernieres donnees chargees, sans attente reseau :
- gmda_getTabledata(table) : le haut de la table en cache sous forme de ds_grid.
- gmda_getBestscore(table) / gmda_getPlayerpos(table) : votre meilleur score et votre rang.
var grid = gmda_getTabledata(1); // ds_grid: rank, player_name, score, cd0, cd1, cd2
for (var i = 0; i < ds_grid_height(grid); i++) {
if (ds_grid_get(grid, 1, i) == "") break; // empty row -> end of data
show_debug_message(string(ds_grid_get(grid, 0, i)) + " " +
ds_grid_get(grid, 1, i) + " " + string(ds_grid_get(grid, 2, i)));
}
show_debug_message("Your best: " + string(gmda_getBestscore(1)) +
" (rank " + string(gmda_getPlayerpos(1)) + ")");// gmda_getTabledata(table) -> ds_grid (6 colonnes x 10 lignes)
// col 0: rank col 1: player_name col 2: score
// col 3: custom_data[0] col 4: custom_data[1] col 5: custom_data[2]
// les lignes se remplissent de haut en bas ; un player_name vide marque la fin des donnees.
// gmda_getExtrainfo(table) -> { level, country, ... } // your panel field names, as submitted : vos propres custom_data sur cette table.Vues : Periodes et Amis
Demandez des vues filtrees (journaliere, hebdomadaire, mensuelle, ou amis uniquement) et lisez view_loaded dans la file.
gmda_loadLeaderboardView(1, "weekly"); // top hebdomadaire
gmda_loadLeaderboardView(1, "all", { friends_only: true }); // amis uniquement
// dans la boucle de poll :
case "view_loaded":
var scores = e.response.scores;
for (var i = 0; i < array_length(scores); i++) {
var row = scores[i];
show_debug_message("#" + string(row.rank) + " " + row.player_name + " " + string(row.score));
}
break;# scores: Array, each row:
{
"rank": int,
"player_key": String,
"player_name": String,
"score": int,
"custom_data": Dictionary,
"date": String
}
# player_score: Dictionary (your own row), or null if you have no score:
{
"rank": int,
"score": int,
"custom_data": Dictionary,
"date": String # period bucket the score belongs to
}
# custom_data keys are the extra fields you defined for the table in the panel.
# The response also carries the table's dashboard config:
# "leaderboard": { "name": String, "sort_order": "asc" | "desc", "periods_enabled": bool }
# Period views (daily/weekly/monthly) additionally include "period" and "period_key".Rechercher et Voir les Joueurs
Recherchez par nom dans une table, ou consultez le profil complet d'un joueur.
gmda_searchPlayers(1, "corvus"); // -> players_search_completed
gmda_loadPlayerInfo("player_key"); // -> player_info_loaded# players_search_completed -> results: Array, each:
{
"rank": int,
"player_key": String,
"player_name": String,
"score": int
}
# player_info_loaded -> player: Dictionary
{
"player_key": String,
"player_name": String,
"is_invitable": bool,
"created_at": String
}
# ...plus scores: Array, one per leaderboard the player appears on:
{
"leaderboard": {
"table_key": String,
"name": String,
"sort_order": String # "asc" | "desc"
},
"rank": int,
"score": int,
"custom_data": Dictionary,
"date": String,
"updated_at": String
}