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 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
。它不必相同 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 上找到此解决方案。
我目前正在开发我的游戏,我决定通过游戏中的 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 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
。它不必相同 class,但在上面的示例中是相同的,并且不遵守当前规则。对于这个例子,ViewController
采用GCHelperDelegate
:
import UIKit
import GCHelper
import GameKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
GCHelper.sharedInstance.authenticateLocalUser()
}
}
在 extension
由于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 上找到此解决方案。