我目前正在开发游戏,因此我决定通过GameCenter中的GameCenter启用多人游戏,以允许用户玩自己的 friend 。我遵循了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)
方法永远不会运行。我完全不知道发生了什么。我已多次尝试解决此问题,但没有任何效果。我将附加一幅图像,该图像显示出问题仍然存在的应用程序的屏幕,并且还将附加我正在使用的代码。
代码
可以使用前面提到的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的控制台中收到以下消息即使在
GCHelper.swift
文件中实现了它。当我在iPhone和iPad Mini上进行测试时,这不会发生,只是一直在说Starting Game...
任何帮助将不胜感激。
最佳答案
先决条件
authenticationChanged
中的GCHelper.swift
不得为private
。您可能必须删除该关键字。 有一些代表参与,在您的示例中,有一些竞争协议(protocol)。我的建议是使用简约代码创建新的应用程序,以跟踪
startMultiplayer
问题。使用GCHelper的Gamekit Multi Player分步教程
使用与您的游戏完全相同的产品名称和组织名称创建一个新项目(Xcode> File> New> Project ...> Single View Application> ...>创建),以便与两个App Bundle匹配标识符和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 Simulator +真实设备)上的“立即播放”。
日志:
Authenticating local user...
Authentication changed: player not authenticated
Ready to start match!
Found player: SandboxPlayer
matchStarted
►在GitHub上找到此解决方案,并在Swift Recipes上找到其他详细信息。