GameCenter Multiplayer坚持"开始游戏......"

Ste*_*sse 8 multiplayer ios game-center sprite-kit swift

我目前正在开发我的游戏,我决定在游戏中通过GameCenter启用多人游戏,以允许用户玩他们的朋友.我遵循了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)

方法永远不会运行.我完全迷失了正在发生的事情.我已经多次尝试过这个问题来解决问题,但没有任何效果.我将附加一个图像,显示我的问题仍然存在的应用程序的屏幕,我还将附加我正在使用的代码.

我正在使用基于GameKitHelper.h上述提到的教程的框架.它是用swift编写的,叫做 GCHelper

可以使用前面提到的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()
      }

 }
Run Code Online (Sandbox Code Playgroud)

图片

游戏中心找到每个玩家并准备好开始比赛,但之后它就停留在开始游戏......

UPDATE

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

警告matchmakerViewController:didFindMatch:委托方法未实现`

即使它是在GCHelper.swift文件中实现的.当我在iPhone和iPad Mini上进行测试时,这种情况不会发生Starting Game...

任何帮助将不胜感激.

Swi*_*ect 1

先决条件

\n
    \n
  • 两个玩家必须处于同一环境中(沙盒
  • \n
  • in一定不能authenticationChangedGCHelper.swift private一定您可能必须删除该关键字。
  • \n
\n

沙盒播放器

\n

涉及一些代表,在您的示例中,有一些竞争协议。我的建议是使用简约的代码创建一个新的应用程序来追踪问题startMultiplayer

\n

使用 GCHelper 的 Gamekit 多人游戏分步教程

\n

使用与您的游戏完全相同的产品名称组织名称创建一个新项目(Xcode > 文件 > 新建 > 项目... > 单视图应用程序 > ... > 创建),以便它与应用程序包标识符iTunes 游戏匹配中心参数。这将允许您在没有开销的情况下运行测试。

\n

使用这个 Podfile:

\n
platform :ios, \'8.0\'\n\nuse_frameworks!\n\ntarget \'SO-31699439\' do\npod \'GCHelper\'\nend\n
Run Code Online (Sandbox Code Playgroud)\n

使用 GCHelperDelegate

\n

创建一个UIViewController只有最低限度的(开始多人游戏按钮),并将其连接到此操作:

\n
@IBAction func startMultiplayerAction(_ sender: AnyObject) {\n    GCHelper.sharedInstance.findMatchWithMinPlayers(\n        2,\n        maxPlayers: 2,\n        viewController: self,\n        delegate: self);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

关键在于:您通过的代表必须采用GCHelperDelegate。它不一定是同一类,但在上面的示例中它是同一类,并且不遵守当前规则。对于本例,ViewController采用GCHelperDelegate

\n
import UIKit\nimport GCHelper\nimport GameKit\n\nclass ViewController: UIViewController {\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        GCHelper.sharedInstance.authenticateLocalUser()\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在中实现所需的 GCHelperDelegate 方法extension

\n

由于ViewController采用GCHelperDelegate,以下三个方法必须在同一个类中,并且被调用:

\n
extension ViewController: GCHelperDelegate {\n    func matchStarted() {\n        print("matchStarted")\n    }\n\n    func match(_ match: GKMatch, didReceiveData: Data, fromPlayer: String) {\n        print("match:\\(match) didReceiveData: fromPlayer:\\(fromPlayer)")\n    }\n\n    func matchEnded() {\n        print("matchEnded")\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

执行

\n

测试:构建、链接、运行、成功匹配。

\n

启动应用程序,点击开始多人游戏按钮,然后在两台设备(或 iPhone 模拟器 + 真实设备)上点击“立即玩”。

\n

现在播放

\n

日志:

\n
@IBAction func startMultiplayerAction(_ sender: AnyObject) {\n    GCHelper.sharedInstance.findMatchWithMinPlayers(\n        2,\n        maxPlayers: 2,\n        viewController: self,\n        delegate: self);\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

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

\n