GameMaker Studio · GML
Tablas de puntaje global
Crear Tablas de Clasificacion
Desde el panel, abre la seccion de Tablas de Clasificacion y crea una tabla dandole un nombre. Puedes declarar hasta 10 tablas por juego.
Configuracion de la Tabla
Una vez creada, configura:
- Orden: descendente o ascendente.
- Puntajes a mostrar: cantidad de filas retornadas.
- Puntaje min/max: limites opcionales; los envios fuera de rango se rechazan.
- Campos personalizados: datos extra por puntaje (nivel, pais, etc.), hasta 20 segun tu plan.
- Puntajes temporales: tablas diaria/semanal/mensual. Apagado = tabla solo historica; un envio que no supere el mejor puntaje no guarda nada.
Guarda la clave de cada tabla; la pasas a gmda_setLeaderboard en el controlador.
Multiples Tablas (base 1)
Declara todas tus tablas juntas. El orden define el numero de tabla en base 1 que pasas a las demas llamadas. La primera clave es la tabla 1.
gmda_setLeaderboard("key_1", "key_2", "key_3");
// key_1 -> tabla 1, key_2 -> tabla 2, key_3 -> tabla 3Enviar Puntajes
Envia un puntaje a una tabla por su numero en base 1, con un struct opcional de campos personalizados, luego lee submit_completed de la cola.
if (gmda_status()) {
gmda_submit(1, score, { level: level_reached }); // -> submit_completed
}
// variante segura sin conexion: encola + reintenta, sobrevive cierres de la 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 solo reemplaza un puntaje en cola cuando el nuevo es mayor. Usa gmda_submit para un envio simple sin reintento. El evento submit_completed reporta el efecto exacto en e.response.effect: "updated" (puntaje historico escrito), "periods_only" (solo mejoraron las tablas diaria/semanal/mensual) o "not_improved" (no se guardo nada). En tablas con puntajes temporales desactivados, un puntaje que no supere tu mejor cacheado ni siquiera se envia (la llamada retorna 0), consulta gmda_getTableConfig(table).
Leer Puntajes
Estos getters sincronos retornan los ultimos datos cargados al instante, sin espera de red:
- gmda_getTabledata(table): el top en cache de la tabla como ds_grid.
- gmda_getBestscore(table) / gmda_getPlayerpos(table): tu mejor puntaje y tu posicion.
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; // fila vacia -> fin de los datos
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 columnas x 10 filas)
// 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]
// las filas se llenan de arriba hacia abajo; un player_name vacio marca el fin de los datos.
// gmda_getExtrainfo(table) -> { level, country, ... } // your panel field names, as submitted : tu propio custom_data en esa tabla.Vistas: Periodos y Amigos
Solicita vistas filtradas (diaria, semanal, mensual o solo amigos) y lee view_loaded de la cola.
gmda_loadLeaderboardView(1, "weekly"); // top semanal
gmda_loadLeaderboardView(1, "all", { friends_only: true }); // solo amigos
// en el bucle 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 y Ver Jugadores
Busca por nombre dentro de una tabla, o consulta el perfil completo de un jugador.
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
}