我目前正在开发游戏,因此我决定通过GameCenter中的GameCenter启用多人游戏,以允许用户玩自己的 friend 。我遵循了RayWinderLinch的教程,但是遇到了问题。

我的问题是,当我加载GKMatchMakingViewController并在两个设备上都按下Play Now大按钮时,它们会彼此找到对方(这是有可能发生的),并且在设置的游戏中心用户名下会显示Ready

这意味着GameCenter已找到每个玩家,并准备开始应有的比赛,但就我而言,比赛从未开始。它停留在一个循环中,上面写着Starting Game...,什么也没发生。看来
func matchmakerViewController(viewController: GKMatchmakerViewController!, didFindMatch theMatch: GKMatch!)

func match(theMatch: GKMatch!, player playerID: String!, didChangeState state: GKPlayerConnectionState)
方法永远不会运行。我完全不知道发生了什么。我已多次尝试解决此问题,但没有任何效果。我将附加一幅图像,该图像显示出问题仍然存在的应用程序的屏幕,并且还将附加我正在使用的代码。



代码

可以使用前面提到的GitHub链接找到GCHelper的代码。


 class GameScene : SKScene, GameKitHelper, MultiplayerNetworkingProtocol {

     override func didMoveToView () {

          GCHelper().authenticateLocalUser() //Authenticate GameCenter User
          println("\n \n \n Authenticating local user \n \n \n")

     }

      func startMultiplayer () {

           var vc = self.view?.window?.rootViewController
           GameKitHelper().findMatchWithMinPlayers(2, maxPlayers: 2, viewController: vc!, delegate: self); //Find match and load GKMatchMakerViewController

      }

       func matchStarted() {

           //Delegate method
           println("match started")

       }

       func matchEnded() {

           //Delegate method
           println("match ended")

       }

        func match(match: GKMatch, didReceiveData: NSData, fromPlayer: String){
        //Delegate Method
        println("Did receive data")

}


     override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

         for touch in (touches as! Set<UITouch>) {
        let location = touch.locationInNode(self)


        if self.nodeAtPoint(location) == multiplayer //SKSpriteNode {

             //User clicked on multiplayer button, launch multiplayer now!
             println("Loading multiplayer")
             startMultiplayer()
      }

 }

图片

ios - GameCenter多人卡在 &#34;Starting Game...&#34;上-LMLPHP



我已经注意到,当我使用iPhone和模拟器进行测试时,在iPhone上状态将从Ready变为Disconnected,但是在模拟器上状态仍为Ready,然后我将在iPhone的控制台中收到以下消息



即使在GCHelper.swift文件中实现了它。当我在iPhone和iPad Mini上进行测试时,这不会发生,只是一直在说Starting Game...
任何帮助将不胜感激。

最佳答案

先决条件

  • 两个玩家都必须在同一环境中(用于测试的沙盒)
  • authenticationChanged 中的GCHelper.swift不得private。您可能必须删除该关键字。

  • ios - GameCenter多人卡在 &#34;Starting Game...&#34;上-LMLPHP
    有一些代表参与,在您的示例中,有一些竞争协议(protocol)。我的建议是使用简约代码创建新的应用程序,以跟踪startMultiplayer问题。
    使用GCHelper的Gamekit Multi Player分步教程
    使用与您的游戏完全相同的产品名称组织名称创建一个新项目(Xcode> File> New> Project ...> Single View Application> ...>创建),以便与两个App Bundle匹配标识符和iTunes Game Center参数。这将使您无需开销即可运行测试。
    使用此Podfile:
    platform :ios, '8.0'
    
    use_frameworks!
    
    target 'SO-31699439' do
    pod 'GCHelper'
    end
    
    使用GCHelperDelegate
    创建一个最低限度的UIViewController(“开始多人游戏”按钮),并将其连接到以下操作:
    @IBAction func startMultiplayerAction(_ sender: AnyObject) {
        GCHelper.sharedInstance.findMatchWithMinPlayers(
            2,
            maxPlayers: 2,
            viewController: self,
            delegate: self);
    }
    
    症结所在:您通过传递的代表必须采用GCHelperDelegate。它不必是同一类,但是在上面的示例中是这样,并且不遵守当前规则。对于此示例,ViewController采用GCHelperDelegate:
    import UIKit
    import GCHelper
    import GameKit
    
    class ViewController: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
            GCHelper.sharedInstance.authenticateLocalUser()
        }
    }
    
    extension实现所需的GCHelperDelegate方法
    由于ViewController采用GCHelperDelegate,因此以下三个方法必须在同一类中,并且将被调用:
    extension ViewController: GCHelperDelegate {
        func matchStarted() {
            print("matchStarted")
        }
    
        func match(_ match: GKMatch, didReceiveData: Data, fromPlayer: String) {
            print("match:\(match) didReceiveData: fromPlayer:\(fromPlayer)")
        }
    
        func matchEnded() {
            print("matchEnded")
        }
    }
    

    执行
    经过测试:构建,链接,运行,成功匹配。
    启动应用程序,点击“启动多人游戏”按钮,点击两台设备(或iPhone Simulator +真实设备)上的“立即播放”。
    ios - GameCenter多人卡在 &#34;Starting Game...&#34;上-LMLPHP
    日志:
    Authenticating local user...
    Authentication changed: player not authenticated
    
    Ready to start match!
    Found player: SandboxPlayer
    matchStarted
    

    ►在GitHub上找到此解决方案,并在Swift Recipes上找到其他详细信息。

    10-04 23:04