GameCenter 多人游戏卡在 "Starting Game..."

GameCenter Multiplayer Stuck on "Starting Game..."

我目前正在开发我的游戏,我决定通过游戏中的 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)

方法永远不会 运行。我完全不知道发生了什么。我一遍又一遍地尝试了很多次来解决这个问题,但没有任何效果。我将附上一张图像,显示我的问题仍然存在的应用程序屏幕,我还将附上我正在使用的代码。

I am using a framework based of of the GameKitHelper.h In the mentioned tutorial above. It is written in swift and is called GCHelper

代码

可以使用前面提到的GitHublink找到GCHelper的代码

I have cut out code that is unnecessary for this problem

 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()
      }

 }

图片

UPDATE

我注意到,当我使用 iPhone 和模拟器进行测试时,在 iPhone 上,状态将从 Ready 变为 Disconnected,但在模拟器上状态仍然是 Ready 然后我会在 iPhone

的控制台中收到以下消息

Warning matchmakerViewController:didFindMatch: delegate method not implemented`

即使它在 GCHelper.swift 文件中实现。当我在我的 iPhone 和 iPad Mini 上测试时,这并没有发生,它一直在说 Starting Game...

任何帮助将不胜感激。

先决条件

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

有几个代表参与,在你的例子中,有几个相互竞争的协议。 我的建议是使用简约代码创建一个新应用程序来追踪 startMultiplayer 问题。

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

创建一个新项目(Xcode > File > New > Project...> Single View Application > ...> Create) 使用相同的 Product Name & Organization Name 作为您的游戏,这样它就可以同时匹配 App Bundle IdentifieriTunes 游戏中心参数。这将允许您 运行 测试而无需开销。

使用这个 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。它不必相同 class,但在上面的示例中是相同的,并且不遵守当前规则。对于这个例子,ViewController采用GCHelperDelegate:

import UIKit
import GCHelper
import GameKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        GCHelper.sharedInstance.authenticateLocalUser()
    }
}

extension

中实现所需的 GCHelperDelegate 方法

由于ViewController采用了GCHelperDelegate,下面三个方法必须在同一个class中,调用:

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模拟器+真实设备)上点按立即播放。

日志:

Authenticating local user...
Authentication changed: player not authenticated

Ready to start match!
Found player: SandboxPlayer
matchStarted

► 在 GitHub and additional details on Swift Recipes 上找到此解决方案。