0

我想制作基于回合的多人益智类型游戏。它适用于所有功能,包括获取任何玩家回合结束的通知。但在 iOS 8.3 中,我无法在玩家回合结束时调用委托方法。任何解决方案?

我也注册了监听器。但它没有被调用。这是代码..

- (void)authenticateLocalUser {

    if (!gameCenterAvailable) return;

    NSLog(@"Authenticating local user...");
    if ([GKLocalPlayer localPlayer].authenticated == NO) {

        __weak typeof(self) weakSelf = self;
        __weak GKLocalPlayer *weakPlayer = [GKLocalPlayer localPlayer];

        weakPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) {
            if (viewController != nil) {
                [weakSelf showAuthenticationDialogWhenReasonable:viewController];
            } else if (weakPlayer.isAuthenticated) {
                // Player has been authenticated!
                [weakPlayer unregisterAllListeners];

                [weakPlayer registerListener:weakSelf];

        //       GKTurnBasedEventHandler *ev =
        //        [GKTurnBasedEventHandler sharedTurnBasedEventHandler];
        //       ev.delegate = self;

            } else {
                // Should disable Game Center?
            }
        };    
    }
}
4

1 回答 1

0

由于您提到结束回合,也许您遇到了 IOS8.3 中引入的错误,该错误会在活动玩家调用 endTurnWithNextParticipants 后中断通知,如下所述:endTurnWithNextParticipants 在更新到 iOS 8.3 和 swift 1.2 后不会触发 receivedTurnEventForMatch

那里提出了一些解决方法,但我发现唯一可靠的解决方案是在非活动设备上设置一个计时器循环并继续重新加载匹配数据,直到您看到自己成为当前参与者。这就是我使用的:

-(void)isMatchActive:(NSTimer *)timer
{
    NSString *matchID = (NSString *)timer.userInfo;

    [GKTurnBasedMatch loadMatchWithID:matchID withCompletionHandler:^(GKTurnBasedMatch *match, NSError *error)
    {
        GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
        GKTurnBasedParticipant *currentParticipant = match.currentParticipant;

        if ([localPlayer.playerID isEqualToString:currentParticipant.player.playerID])
        {
            //we have become active. Call the event handler like it's supposed to be called
            [self player:localPlayer receivedTurnEventForMatch:match didBecomeActive:false];
        }
        else
        {
            //we are still waiting to become active. Check back soon
            float dTime = 5.0;
            gameController.IOS8BugTimer = [NSTimer scheduledTimerWithTimeInterval:dTime
                                                                          target:self
                                                                     selector:@selector(isMatchActive:)
                                                                     userInfo:matchID
                                                                      repeats:NO];
         }
     }];
}
于 2015-05-30T17:36:42.077 回答