GameMaker Studio · GML
Глобальные таблицы лидеров
Создание таблиц лидеров
В панели откройте раздел «Таблицы лидеров» и создайте таблицу, указав название. Вы можете объявить до 10 таблиц на игру.
Настройки таблицы лидеров
После создания настройте:
- Порядок: по убыванию или по возрастанию.
- Показывать результатов: количество возвращаемых строк.
- Мин/макс результат: необязательные границы; отправки вне диапазона отклоняются.
- Пользовательские поля: дополнительные данные к результату (уровень, страна и т. д.), до 20 в зависимости от плана.
- Временные результаты: таблицы за день/неделю/месяц. Выключено = только историческая таблица; отправка, не превышающая лучший результат, ничего не сохраняет.
Сохраните ключ каждой таблицы; вы передаёте их в gmda_setLeaderboard в контроллере.
Несколько таблиц (нумерация с 1)
Объявляйте все ваши таблицы вместе. Порядок определяет номер таблицы (с 1), который вы передаёте во все остальные вызовы. Первый ключ это таблица 1.
gmda_setLeaderboard("key_1", "key_2", "key_3");
// key_1 -> table 1, key_2 -> table 2, key_3 -> table 3Отправка результатов
Отправьте результат в таблицу по её номеру (с 1), с необязательной структурой пользовательских полей, затем прочитайте submit_completed из очереди.
if (gmda_status()) {
gmda_submit(1, score, { level: level_reached }); // -> submit_completed
}
// offline-safe variant: queues + retries, survives app closes
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 заменяет результат в очереди только тогда, когда новый выше. Используйте gmda_submit для простой отправки без повторов. Событие submit_completed сообщает точный эффект в e.response.effect: "updated" (исторический результат записан), "periods_only" (улучшились только таблицы за день/неделю/месяц) или "not_improved" (ничего не сохранено). В таблицах с выключенными временными результатами результат, не превышающий ваш лучший в кеше, даже не отправляется (вызов возвращает 0), см. gmda_getTableConfig(table).
Чтение результатов
Эти синхронные геттеры мгновенно возвращают последние загруженные данные, без ожидания сети:
- gmda_getTabledata(table): закешированная вершина таблицы как ds_grid.
- gmda_getBestscore(table) / gmda_getPlayerpos(table): ваш лучший результат и ваша позиция.
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 columns x 10 rows)
// 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]
// rows fill top-down; an empty player_name marks the end of the data.
// gmda_getExtrainfo(table) -> { level, country, ... } // your panel field names, as submitted : your own custom_data on that table.Представления: периоды и друзья
Запрашивайте отфильтрованные представления (дневное, недельное, месячное или только друзья) и читайте view_loaded из очереди.
gmda_loadLeaderboardView(1, "weekly"); // weekly top
gmda_loadLeaderboardView(1, "all", { friends_only: true }); // friends only
// in the poll loop:
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".Поиск и просмотр игроков
Ищите по имени внутри таблицы или открывайте полный профиль игрока.
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
}