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);
};
}
我正在尝试将排行榜合并到我的 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);
};
}