我目前正在开发游戏,我决定在游戏中通过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()
}
}
图像
更新
我注意到当我使用iPhone和模拟器进行测试时,iPhone上的状态将从Ready
变为Disconnected
,但在模拟器上状态仍为Ready
且然后我将在iPhone的控制台中收到以下消息
警告matchmakerViewController:didFindMatch:委托方法未实现`
即使它是在GCHelper.swift
文件中实现的。当我在我的iPhone和iPad Mini上进行测试时,这种情况不会发生,只是继续说Starting Game...
任何帮助将不胜感激。
答案 0 :(得分:1)
authenticationChanged
中的GCHelper.swift
不得为private
。您可能必须删除该关键字。涉及一些代表,在您的示例中,有一些竞争协议。 我的建议是使用简约代码创建新的应用以追踪startMultiplayer
问题。
使用完全相同的产品创建新项目(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
由于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上找到其他详细信息。