我正在为棋盘游戏使用回合制比赛,当回合完成时,我会调用GKTurnBasedMatch.EndTurn并将匹配参与者和新匹配数据作为参数传递。我需要让游戏前进到无与伦比的玩家,但只有在与超时值相关的一些不确定时间之后才会这样做。设置超时值0只会阻止游戏进入播放器1.匹配数据正在更新,因此应用程序肯定与Game Center服务器通信。我在这里缺少什么?
private void endTurn(double timeout)
{
// Copies list of participants to a mutable array
GKTurnBasedParticipant[] Participants = new GKTurnBasedParticipant[match.Participants.Length];
match.Participants.CopyTo(Participants, 0);
// Advances to the next player
match.EndTurn(Participants, timeout, matchData, (e) =>
{
// If there is an error message, print it to the console
if (e != null)
{
Console.WriteLine(e.LocalizedDescription);
Console.WriteLine(e.LocalizedFailureReason);
}
// Otherwise proceed normally
else
turnOverUpdate();
});
}
答案 0 :(得分:0)
Apple的文档对于EndTurn方法来说非常糟糕,但我明白了。 NextParticipants字段应该被视为EndTurnWithNextParticipant,因此您必须复制GKTurnBasedMatch.Participants并重新排序,以便下一个播放器是第一个,所以第四个。该匹配仅为参与者提供加入顺序,而不是相对于本地玩家,因此您必须对其进行排序。以下是我用来完成此任务的代码。
List<GKTurnBasedParticipant> participants = new List<GKTurnBasedParticipant>();
// Gets the index of the local player
int index = 0;
for (int i = 0; i < match.Participants.Length; i++)
{
if (match.Participants[i].Player != null)
{
if (match.Participants[i].Player.PlayerID == GKLocalPlayer.LocalPlayer.PlayerID)
{
index = i;
break;
}
}
}
int offset = match.Participants.Length - index;
for (int i = 1; i < offset; i++)
participants.Add(match.Participants[i + index]);
for (int i = 0; i <= index; i++)
participants.Add(match.Participants[i]);
GKTurnBasedParticipant[] nextParticipants = participants.ToArray();