GKTurnBasedMatch不会一直前进到下一个玩家(Xamarin,Apple GameKit)

时间:2018-03-16 23:06:32

标签: ios xamarin game-center gamekit gkturnbasedmatch

我正在为棋盘游戏使用回合制比赛,当回合完成时,我会调用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();
        });
    }

1 个答案:

答案 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();