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

时间:2015-07-29 11:40:16

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

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

 }

图像

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...

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

先决条件

  • 两位玩家必须在同一环境中( Sandbox 进行测试)
  • authenticationChanged 中的GCHelper.swift不得private。您可能必须删除该关键字。

Sandbox Player

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

使用GCHelper

的Gamekit Multi Player Step by Step教程

使用完全相同的产品创建新项目(Xcode&gt;文件&gt;新&gt;项目...&gt;单一视图应用程序&gt; ...&gt;创建)姓名&amp; 组织名称作为您的游戏,以便它与 App Bundle Identifier 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模拟器+真实设备)上的立即播放。

Play now

<强>日志:

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

Ready to start match!
Found player: SandboxPlayer
matchStarted

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