GameMaker Studio · GML
Rankings globais
Criando Rankings
No painel, acesse a seção de Rankings e crie uma tabela informando um nome. Você pode declarar até 10 tabelas por jogo.
Configurações do Ranking
Uma vez criado, configure:
- Ordem: decrescente ou crescente.
- Pontuações a exibir: número de linhas retornadas.
- Pontuação mín/máx: limites opcionais; envios fora deles são rejeitados.
- Campos personalizados: dados extras por pontuação (nível, país, etc.), até 20 conforme seu plano.
- Pontuações temporais: tabelas diária/semanal/mensal. Desligado = tabela apenas histórica; um envio que não supere a melhor pontuação não grava nada.
Guarde a chave de cada tabela; você as passa para gmda_setLeaderboard no controlador.
Múltiplas Tabelas (baseadas em 1)
Declare todas as suas tabelas juntas. A ordem define o número da tabela (baseado em 1) que você passa para todas as outras chamadas. A primeira chave é a tabela 1.
gmda_setLeaderboard("key_1", "key_2", "key_3");
// key_1 -> tabela 1, key_2 -> tabela 2, key_3 -> tabela 3Enviando Pontuações
Envie uma pontuação para uma tabela pelo seu número (baseado em 1), com uma struct opcional de campos personalizados, depois leia submit_completed da fila.
if (gmda_status()) {
gmda_submit(1, score, { level: level_reached }); // -> submit_completed
}
// variante segura para offline: enfileira + repete, sobrevive ao fechamento do 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 só substitui uma pontuação enfileirada quando a nova é maior. Use gmda_submit para um envio simples sem repetição. O evento submit_completed reporta o efeito exato em e.response.effect: "updated" (pontuação histórica gravada), "periods_only" (apenas as tabelas diária/semanal/mensal melhoraram) ou "not_improved" (nada foi gravado). Em tabelas com pontuações temporais desativadas, uma pontuação que não supere a sua melhor em cache nem sequer é enviada (a chamada retorna 0), consulte gmda_getTableConfig(table).
Lendo Pontuações
Estes getters síncronos retornam os últimos dados carregados instantaneamente, sem espera de rede:
- gmda_getTabledata(table): o topo da tabela em cache como uma ds_grid.
- gmda_getBestscore(table) / gmda_getPlayerpos(table): sua melhor pontuação e sua posição.
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; // linha vazia -> fim dos dados
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 colunas x 10 linhas)
// 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]
// as linhas preenchem de cima para baixo; um player_name vazio marca o fim dos dados.
// gmda_getExtrainfo(table) -> { level, country, ... } // your panel field names, as submitted : seus próprios custom_data nessa tabela.Visualizações: Períodos e Amigos
Solicite visualizações filtradas (diária, semanal, mensal ou apenas amigos) e leia view_loaded da fila.
gmda_loadLeaderboardView(1, "weekly"); // top semanal
gmda_loadLeaderboardView(1, "all", { friends_only: true }); // apenas amigos
// no loop 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".Buscar e Ver Jogadores
Busque por nome dentro de uma tabela, ou consulte o perfil completo de um jogador.
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
}