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...
任何帮助将不胜感激.
authenticationChanged是GCHelper.swift private一定您可能必须删除该关键字。涉及一些代表,在您的示例中,有一些竞争协议。我的建议是使用简约的代码创建一个新的应用程序来追踪问题startMultiplayer。
使用与您的游戏完全相同的产品名称和组织名称创建一个新项目(Xcode > 文件 > 新建 > 项目... > 单视图应用程序 > ... > 创建),以便它与应用程序包标识符和iTunes 游戏匹配中心参数。这将允许您在没有开销的情况下运行测试。
\n使用这个 Podfile:
\nplatform :ios, \'8.0\'\n\nuse_frameworks!\n\ntarget \'SO-31699439\' do\npod \'GCHelper\'\nend\nRun Code Online (Sandbox Code Playgroud)\n使用 GCHelperDelegate
\n创建一个UIViewController只有最低限度的(开始多人游戏按钮),并将其连接到此操作:
@IBAction func startMultiplayerAction(_ sender: AnyObject) {\n GCHelper.sharedInstance.findMatchWithMinPlayers(\n 2,\n maxPlayers: 2,\n viewController: self,\n delegate: self);\n}\nRun Code Online (Sandbox Code Playgroud)\n关键在于:您通过的代表必须采用GCHelperDelegate。它不一定是同一类,但在上面的示例中它是同一类,并且不遵守当前规则。对于本例,ViewController采用GCHelperDelegate:
import UIKit\nimport GCHelper\nimport GameKit\n\nclass ViewController: UIViewController {\n override func viewDidLoad() {\n super.viewDidLoad()\n GCHelper.sharedInstance.authenticateLocalUser()\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n在中实现所需的 GCHelperDelegate 方法extension
由于ViewController采用GCHelperDelegate,以下三个方法必须在同一个类中,并且将被调用:
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}\nRun Code Online (Sandbox Code Playgroud)\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}\nRun Code Online (Sandbox Code Playgroud)\n\xe2\x96\xba 在GitHub上找到此解决方案,并在Swift Recipes上找到其他详细信息。
\n