2

在 objC中,当时由Rawendrich for编写的语法,现在由 Apple 更改如下。GKTurnBasedEventListenerGKTurnBasedEventHandler

 if (!gameCenterAvailable) return;

void (^setGKEventHandlerDelegate)(NSError *) = ^ (NSError *error)
{
    GKTurnBasedEventHandler *ev = 
      [GKTurnBasedEventHandler sharedTurnBasedEventHandler];
    ev.delegate = self;
};

NSLog(@"Authenticating local user...");
if ([GKLocalPlayer localPlayer].authenticated == NO) {     
    [[GKLocalPlayer localPlayer] 
     authenticateWithCompletionHandler:
      setGKEventHandlerDelegate];        
} else {
    NSLog(@"Already authenticated!");
    setGKEventHandlerDelegate(nil);
}

GKTurnBasedEventListener现在,在将其转换为 swift 之后,并使用写下而不是 的作文GKTurnBasedEventHandler,这是以下方式。

//  Converted with Swiftify v1.0.6381 - https://objectivec2swift.com/
if !gameCenterAvailable {
return
}
var setGKEventHandlerDelegate: ((_: Error) -> Void)? = {(_ error:   Error?) -> Void in
    var ev = GKTurnBasedEventHandler.shared()
    ev.delegate = self
}
print("Authenticating local user...")
if GKLocalPlayer.localPlayer().authenticated == false {
GKLocalPlayer.localPlayer().authenticate(withCompletionHandler:    setGKEventHandlerDelegate)
}
else {
print("Already authenticated!")
setGKEventHandlerDelegate(nil)

}

不幸的是,这不是GKTurnBasedEventListener为我的ViewController.

请如果你们中的任何人可以为我解决这个问题,因为没有这个我无法阅读事件侦听器的默认函数。

干杯!

4

2 回答 2

2

仅供参考,如果您想了解如何在回合制 GameKit 比赛中使用 GKLocalPlayerListener 的工作示例,欢迎您查看此示例项目以了解回合制游戏。我希望它有助于在上下文中查看所有部分。

于 2017-07-27T22:21:25.947 回答
0

终于经过大约 10 个小时的严酷考验,我从这里发现了这个问题。虽然这个语法在 objC 中,但是从Swiftify转换为 swift 是没有问题的。

虽然比实际时间晚了一点,但我现在能够理解设置委托GKTunBasedEventListener不像我们所做的那样UITableViewControllerDelegate

在这里,必须先验证本地播放器,然后将本地播放器的侦听器注册到ViewControllerGKLocalPlayerListener delegate

我在Apple 的文档中发现的另一件事: 不要直接实现GKChallengeListenerGKInviteEventListenerGKSavedGameListenerGKTurnBasedEventListenerGKLocalPlayerListener改为实施。您可以使用 监听和处理多个事件GKLocalPlayerListener

那么我已经按照以下方式实现了。

import GameKit

class ViewController: UIViewController,   GKTurnBasedMatchmakerViewControllerDelegate, 
GKLocalPlayerListener {


..... 


func player(_ player: GKPlayer, receivedTurnEventFor match: GKTurnBasedMatch, didBecomeActive: Bool) {

    print("#1")
    print(player)
    print("#2")
    print(match)
    print("#3")
    print(didBecomeActive)

    if match.status == GKTurnBasedMatchStatus.open
    {
        if GKLocalPlayer.localPlayer() == match.currentParticipant
        {


        if didBecomeActive
        {
            // Active now
        }
        else
        {
            // Active already
        }

        }
        else
        {
            // It's someone's turn

            if match.matchData != myMatch?.matchData
            {
               // Match Data being Updated by Someone
                print(player.alias ?? "No Name:")
            }

        }


    }

    thirdTopLabel.text = match.matchID! + "\n" + didBecomeActive.description

}

.... 

现在在ViewDidLoad()函数中放入以下代码。

// In the ViewDidLoad function 
 if(!GKLocalPlayer.localPlayer().isAuthenticated)
    {
        authenticatePlayer { (auth) in

            weak var weakSelf = self
            weak var weakPlayer = GKLocalPlayer.localPlayer()

            if(auth){


                 weakPlayer?.register(weakSelf!)
                 self.suthentication = true;

            }
            else{
                print("failed in authentication")
                self.suthentication = false;
            }

        }

    }
    else
    {
        // Already Authenticated
        GKLocalPlayer.localPlayer().register(self)
        localPlayer = GKLocalPlayer.localPlayer()


    }

最后你的 Authentication 函数应该是这样的。

// authenticate local player :: Just Authentication
func authenticatePlayer(completionHandler: @escaping (_ resultedPlaces: Bool) -> Void) {

    localPlayer = GKLocalPlayer.localPlayer()


    localPlayer.authenticateHandler =
        { (viewController , error ) -> Void in
            if viewController != nil
            {
                self.present(viewController!, animated:true, completion: nil)
            }
            else
            {
                if self.localPlayer.isAuthenticated
                {

                    completionHandler(true);
                }
                else
                {
                    completionHandler(false);


                    print("not able to authenticate fail")
                    self.gameCenterEnabled = false

                    if (error != nil)
                    {
                        print("\(error.debugDescription)")
                    }
                    else
                    {
                        print(    "error is nil")
                    }
                }
            }

    }
}

注意:GKLocalPlayerListener不适用于模拟器。

于 2017-07-04T06:24:41.147 回答