【问题标题】:GameCenter Multiplayer Stuck on "Starting Game..."GameCenter 多人游戏卡在“开始游戏...”
【发布时间】:2015-10-20 08:59:07
【问题描述】:

我目前正在开发我的游戏,我决定在游戏中通过 GameCenter 启用多人游戏,以允许用户玩他们的朋友。我遵循RayWinderLinch 的教程,但遇到了问题。

我的问题是,当我加载 GKMatchMakingViewController 并在两台设备上点击大的 Play Now 按钮时,它会找到彼此(这意味着会发生)并且在设置的游戏中心用户名下它会说 @ 987654327@。

这意味着 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()
      }

 }

图片

更新

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

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 您是否将游戏中心代理设置为自我/控制器?我发现 Game Center 在模拟器上比较有问题,所以我总是使用真机进行测试
  • 我对你说的不是很清楚,我也试过在真机上测试
  • 您需要实现didFindMatch - 在该方法中您可以关闭媒人视图控制器
  • 在帖子中提到的GCHelper类中实现
  • 但是在您的startMultiplayer() 中,您将委托设置为self - 所以它希望这些方法在您的类中实现,而不是在 GCHelper 中实现。

标签: ios swift sprite-kit game-center multiplayer


【解决方案1】:

先决条件

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

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

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

创建一个新项目(Xcode > File > New > Project...> Single View Application > ... > Create) 使用相同的 Product Name & 组织名称作为您的游戏,使其与 App Bundle IdentifieriTunes 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 模拟器 + 真实设备)上点按立即播放。

日志:

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 中复制了确切的代码。谢谢
猜你喜欢
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
相关资源
最近更新 更多