UWP Xbox Live 排行榜

UWP Xbox Live Leaderboards

我正在尝试将排行榜合并到我的 UWP 游戏中。我正在使用 C# 和 XAML 来创建我的游戏。我创建了一个高分排行榜,并使用仪表板中的测试按钮推送了它。

我已通过调用将记录推送到排行榜:

_stats.SetStatisticIntegerData(XboxUser, "score", XP);
_stats.RequestFlushToService(XboxUser, true);

我收到来自服务器的成功响应。

当我尝试通过以下方式从服务器检索排行榜时:

_stats.GetLeaderboard(XboxUser, "score", new LeaderboardQuery());

我收到了成功的回复。

问题是我的回复没有收到任何行。我返回了显示名称为 High Score 的一列,但没有行。

有人知道我做错了什么吗?

更新 更多信息:

我创建了一个ID为score的排行榜。

当我调用以下内容时:

var val = _stats.GetStatistic(XboxUser, "score");

它抛出以下异常:

The parameter is incorrect.

Stat not found in document

当我将数据存储到排行榜中时,我得到以下信息:

静态事件:

错误代码:0

错误消息:“”

EventArgs: 空

事件类型:StatisticUpdateComplete

用户:我的用户

我有答案!在调用 add static 或获取排行榜之前,您必须等到 StatisticEventType.LocalUserAdded 事件完成。

_stats.DoWork 不是异步方法或 do 方法 它就像一个检查方法,它只是检查前一个动作的结果 所以你必须把这个 DoWork in-game Frame 或 DispatcherTimer 一次又一次地检查结果。在您获得 StatisticEventType.GetLeaderboardComplete 结果之前,您可以获得 LeaderBoard 结果。 这是我使用 DispatcherTimer

的部分代码
enter code here
    public static DispatcherTimer timer = new DispatcherTimer();

    static void GetLeaderboard(string leaderBoardName)
    {
        if (!is_online) return;


        var statManager = StatisticManager.SingletonInstance;
        LeaderboardQuery query = new LeaderboardQuery
        {
            SkipResultToMe = true,
            //SkipResultToRank = 100,
            MaxItems = 5,
        };
        statManager.GetLeaderboard(xboxUser, leaderBoardName, query);

        timer.Interval = TimeSpan.FromSeconds(0.05);
        timer.Start();
        timer.Tick += (s, e) =>
        {

            IReadOnlyList<StatisticEvent> statEvents = statManager.DoWork();
            //In practice this should be called everyupdate frame

            foreach (StatisticEvent statEvent in statEvents)
            {
                if (statEvent.EventType == StatisticEventType.GetLeaderboardComplete
                && statEvent.ErrorCode == 0)
                {
                    LeaderboardResultEventArgs leaderArgs = (LeaderboardResultEventArgs)statEvent.EventArgs;
                    LeaderboardResult leaderboardResult = leaderArgs.Result;
                    foreach (LeaderboardRow leaderRow in leaderboardResult.Rows)
                    {
                        Debug.WriteLine(string.Format("Rank: {0} | Gamertag: {1} | {2}:{3}\n\n", leaderRow.Rank,
                        leaderRow.Gamertag, "test", leaderRow.Values[0]));
                    }
                    timer.Stop();
                }

                Debug.WriteLine(statEvent.EventType.ToString());
                Debug.WriteLine(statEvent.ErrorCode);

            }

            Debug.WriteLine(statEvents.Count);

        };


        
    }