游戏中心多人游戏卡在“开始游戏…”界面

9
我目前正在开发游戏,并决定通过GameCenter启用多人游戏,以允许用户与朋友玩游戏。我已经按照RayWinderLinch的教程进行了操作,但遇到了问题。
我的问题是当我加载GKMatchMakingViewController并在两个设备上点击大的Play Now按钮时,它们会找到彼此(这是有意为之),并在设置Game Center用户名下显示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代码 GCHelper的代码可以在之前提到的GitHub链接中找到。 我已经剪切了与此问题无关的代码。
 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()
      }

 }

图片

Game center finds each player and is ready to start the match but then it get's stuck on Starting Game...

我注意到当我使用我的 iPhone 和模拟器进行测试时,iPhone 的状态从“Ready”变为“Disconnected”,但是在模拟器上,状态仍然是“Ready”,然后我会在 iPhone 的控制台中收到以下消息:
“警告matchmakerViewController:didFindMatch:委托方法未实现”。
尽管在GCHelper.swift文件中已经实现了该方法。当我在我的 iPhone 和 iPad Mini 上进行测试时不会发生这种情况,它只会一直显示“Starting Game...”。
任何帮助将不胜感激。

你是否将Game Center的委托设置为self/controller?我发现模拟器上的Game Center相当不稳定,所以我总是使用真实设备进行测试。 - Martin
我对你所提到的内容没有清晰的理解,我也尝试在真实设备上进行测试。 - Jesse Onolemen
你需要实现 didFindMatch 方法 - 在这个方法中,你可以关闭匹配视图控制器。 - Martin
赏金我相信昨天已经过期了,但感谢您的回答。 - Jesse Onolemen
不客气。这是一项富有教育意义的研究。但根据时间戳,似乎我“2天前回答了”… - SwiftArchitect
显示剩余2条评论
1个回答

1

先决条件

  • 两名玩家必须处于同一环境下(测试时为沙盒)。
  • GCHelper.swift中的authenticationChanged 不能private。你可能需要删除该关键字。

Sandbox Player

有几个代表参与其中,在您的示例中,有几个竞争协议。我的建议是创建一个新的应用程序,使用简约代码来跟踪 startMultiplayer 问题。
Gamekit 多人游戏分步教程使用 GCHelper 创建一个新项目(Xcode > 文件 > 新建 > 项目… > 单视图应用程序 > … > 创建),使用与游戏相同的产品名称和组织名称,以便匹配 App Bundle Identifier 和 iTunes 游戏中心参数。这将使您能够在没有开销的情况下运行测试。
使用此 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模拟器+真实设备)上点击开始多人游戏按钮,然后在两个设备上都点击立即开始

Play now

日志:

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

Ready to start match!
Found player: SandboxPlayer
matchStarted

► 在GitHub上找到此解决方案,更多细节请参见Swift Recipes


嗨,谢谢你的回复!但是当我尝试安装pod文件时,终端显示了一个消息:[!] Unable to find a target named SO-31699439。所以我想知道我是否做错了什么,我已经从上面的podfile中复制了完全相同的代码。谢谢。 - Jesse Onolemen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接