我试图在回合制游戏中实现一个事件监听器,这样玩家可以在轮到他或者被朋友邀请时接收.在IOS 7中不推荐使用GKTurnBasedEventHandler,我在文档中读到了我应该使用的GKLocalPlayerListener; 但这是它的延伸.是否有人使用过它,因为任何地方都没有信息.
这是我以前尝试过的,它不起作用.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
[localPlayer authenticateWithCompletionHandler:^(NSError *error)
{
if (localPlayer.isAuthenticated)
{
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
[localPlayer registerListener:self];
}
}];
return YES;
}
-(void)handleInviteFromGameCenter:(NSArray *)playersToInvite
{
NSLog(@"test");
}
- (void)player:(GKPlayer *)player receivedTurnEventForMatch:(GKTurnBasedMatch *)match didBecomeActive:(BOOL)didBecomeActive
{
NSLog(@"test");
}
Run Code Online (Sandbox Code Playgroud) 这是这个问题的后续行动.如果您没有收到任何回调handleTurnEventForMatch:didBecomeActive:,请在那里尝试答案.
在我的游戏中,我只是在某些时候收到转弯事件通知.但如果我回到matchMakerViewController并重新加载比赛,状态总是正确的.
我的游戏在每个回合中多次上传转弯状态.有趣的是,似乎如果其他设备收到对手轮到的一个通知,则不太可能接收到同一回合的进一步通知.但是,这不是100%.
一般来说,我的互联网连接似乎运作良好.
可能导致这种情况的任何想法?
我正在处理Game Kit的GKTurnBasedMatch类中的损坏问题(请参阅此主题),这有时会导致游戏状态无效,matchData损坏.
因此,作为一种解决方法,我正在创建一种方法来识别这些无效匹配,以便我可以适当地处理它们.损坏的matchData似乎是一种很好的方法.但是,到目前为止,我一直无法识别它们.当我这样做:
// "match" is an existing GKTurnBasedMatch object
NSLog(@"match data is: %@",[match matchData]);
NSLog(@"match data is nil? %@",[match matchData] == nil ? @"YES" : @"NO");
NSLog(@"match data equals empty nsdata? %@",[match matchData] == [NSData data] ? @"YES" : @"NO");
Run Code Online (Sandbox Code Playgroud)
我得到以下内容:
match data is: <>
match data is nil? NO
match data equals empty nsdata? NO
Run Code Online (Sandbox Code Playgroud)
所以匹配数据显示为一对空括号"<>",我希望可以将其标识为零,但显然不是.
顺便说一句,我将此matchData存储在NSData属性下的核心数据实体中.当我保存NSManagedObjectContext,然后NSLog NSManagedObject查看其中的内容时,有问题的NSData属性仍显示为"<>"!
但是,如果我然后创建一个新的 NSManagedObjectContext,从中检出相同的NSManagedObject,然后 NSLog其值,NSData属性现在显示为nil.
所以才出现,在某些时候,核心数据是"清洗"的属性,其波普尔零值.我的问题是,在将该值添加到核心数据存储之前,我实际上需要在该点之前将该值标识为 …
我正在测试两个设备之间的回合制游戏.据我了解,[GKTurnBasedMatch endTurnWithNextParticipants:]例如,发送转弯应自动将游戏中心通知推送给对手.有时,这可以正常工作:转弯发送,并立即在另一台设备上显示横幅通知.一切都很好.
令我困惑的是,其他时候,即使转弯本身发送正确(我可以告诉,因为当对手刷新比赛时,比赛是最新的),没有推送通知进来.
我的理解在这里有什么漏洞吗?如果我理解正确,不一致的通知不应该与我的代码有任何关系,因为这里的问题不是我处理通知的方式,而是根本没有通知.换句话说,[handleTurnEventForMatch:](一种GKTurnBasedEventHandlerDelegate方法)与它没有任何关系(我不认为)因为如果没有收到任何通知,它就永远不会被调用.
所以,我只是想知道是否有人对此有任何经验.这是否可能是由于我的代码中的某些内容?或者,游戏中心沙箱是否可能导致不一致,我无能为力呢?
任何想法或想法将不胜感激.
我正在开发基于回合制的GameCenter游戏.A GKTurnBasedMatch创建时使用a GKMatchRequest,with minPlayers并maxPlayers设置为2.我会NSInvalidArgumentException尝试结束游戏endMatchInTurnWithMatchData,并告诉我没有设置matchOutcome所有参与者.在此点之前记录匹配对象会显示我的匹配如下所示:
<GKTurnBasedMatch 0x1c1f2af0 - matchID:c9de6e47-0e9a-4dbe-944b-d2fd4ecd3044 bundleID:com.mybundle.wd status:GKTurnBasedMatchStatusEnded message:'Game Over' creationDate:2013-10-08 01:26:12 +0000 currentParticipant:(null) participants:
<GKTurnBasedParticipant 0x1c184820 - playerID:G:128458444 (local player) status:Done matchOutcome:Lost lastTurnDate:2013-10-10 21:54:22 +0000 timeoutDate:(null)>,
<GKTurnBasedParticipant 0x1c1b0a80 - playerID:G:220673962 status:Done matchOutcome:Lost lastTurnDate:2013-10-10 18:26:16 +0000 timeoutDate:(null)>,
<GKTurnBasedParticipant 0x16ef1610 - playerID:G:128458444 (local player) status:Active matchOutcome:None lastTurnDate:(null) timeoutDate:(null)>,
<GKTurnBasedParticipant 0x16ec64f0 - playerID:(null) status:Matching matchOutcome:None lastTurnDate:(null) timeoutDate:(null)> matchData.length:871 matchDataMaximumSize:65536 exchanges:(null)>
Run Code Online (Sandbox Code Playgroud)
我GKTurnBasedParticipants这里有2个以上,其中两个是同一个玩家!我在游戏中没有做任何特别的事情,除了每回合调用以下内容:
[match endTurnWithNextParticipants:@[nextParticipant] turnTimeout:GKTurnTimeoutDefault matchData:data completionHandler:^(NSError *error){...}] …Run Code Online (Sandbox Code Playgroud) 我目前正在使用Game Center Sandbox测试我的Game Center Aware App,其中一个实例在iOS模拟器上运行,另一个在Retina iPad Mini上运行.我有一个需要接收转弯事件的视图控制器,所以我实现了该方法
player:receivedTurnEventForMatch:didBecomeActive:
Run Code Online (Sandbox Code Playgroud)
在我的UIViewController子类采用的GKLocalPlayerListener协议中,然后使用此行注册事件
[[GKLocalPlayer localPlayer] registerListener: self];
Run Code Online (Sandbox Code Playgroud)
在视图控制器的init方法中.然而,尽管游戏中心应用程序说游戏的两个实例已连接,但这种方法很少在iPad上调用,我不认为我曾经见过模拟器实例调用它.但是,转到Game Center App会显示两个实例都已更新,表明两个实例都能够接收事件.可能是什么导致了这个?
我正在研究一个简单的回合制文字游戏,我很难搞清楚邀请是如何工作的.当用户A邀请用户B参加游戏时,我希望用户B能够在我的自定义匹配界面(即列出所有用户B的游戏的屏幕)中看到该游戏.如果用户B在被邀请参加游戏时点击通知,情况会很好,但如果用户B只是自己导航到应用程序,我仍然希望通过我自己的界面看到游戏.
每当出现这个匹配界面屏幕时,我都会[GKTurnBasedMatch loadMatchesWithCompletionHandler:]用来获取所有本地玩家的比赛.有了这个,我会假设用户B能够看到他被邀请参加的比赛,但这个新比赛没有出现.如果我通过该接受邀请GKTurnBasedMatchmakerViewController,则用户按预期进入游戏,但更令人费解的是,如果我打开我的GKTurnBasedMatchmakerViewController然后取消而不接受邀请,现在我的自定义匹配界面中会出现一个新的匹配,但它缺少用户A发送的匹配数据.
总而言之,我真的只是想知道如何GKTurnBasedMatch使用自定义界面正确显示和接受邀请(而不是必须使用GKTurnBasedMatchmakerViewController).谢谢!
我正在使用GKTurnBasedMatch开发iOS游戏中心游戏.每次轮回不完整,控制台中都会出现如下信息:
2013-04-26 19:26:45.115 AppName[6439:5a9f] CONNECTION INTERRUPTED
Run Code Online (Sandbox Code Playgroud)
有趣的是,当我发送一个完整的转弯时,这不会发生
[match endTurnWithNextParticipants: nextParticipants turnTimeout:100000 matchData: data completionHandler:^(NSError* error){
// some block here
}];
Run Code Online (Sandbox Code Playgroud)
但是当我发送一个不完整的转弯时确实会发生
[match saveCurrentTurnWithMatchData:data completionHandler:^(NSError* error) {
// some block here
}];
Run Code Online (Sandbox Code Playgroud)
其他人在这里报告了类似的问题:Spurious Game Center播放器断开连接消息.但是,很难看出那里唯一的答案如何适用于我的情况,因为我正在使用GKMatchmakerViewController创建匹配.
这是关于GameCenter.
由于"的GKLocalPlayerListener协议继承方法GKChallengeListener,GKInviteEventListener和GKTurnBasedEventListener.
为了处理多个事件"和"没有实现GKChallengeListener,GKInviteEventListener和GKTurnBasedEventListener直接; GKLocalPlayerListener而实施.
您可以使用GKLocalPlayerListener"(这些来自Apple文档)来监听和处理多个事件.
可以预期,在经过身份验证之后注册GKLocalPlayerListener之后,当适当的事件发生时,将调用其中的GKLocalPlayer.localPlayer()所有方法GKLocalPlayerListener.
但是,除了"播放器(player:GKPlayer,receivedTurnEventForMatch match:GKTurnBasedMatch,didBecomeActive:Bool)"之外,所有其他方法,包括"player(player:GKPlayer,matchEnded match :) GKTurnBasedMatch"在发生此类事件时都不会被调用.
我们需要注册一些其他听众还是我缺少一些东西?
我正在使用 Game Center 的回合制比赛构建游戏。
我想显示所有可用匹配项的列表。我试过使用loadMatchesWithCompletionHandler(),但游戏数组返回为nil,错误也返回为nil。有一些正在进行的比赛。
这是我到目前为止:
func authenticateLocalUser() {
if !gameCenterAvailable { return }
let player = GKLocalPlayer.localPlayer()
if player.authenticated == false {
player.authenticateHandler = {(viewController, error) -> Void in
if viewController != nil && self.presentingViewController != nil
{
self.presentingViewController!.presentViewController(viewController!, animated: true, completion: {
GKLocalPlayer.localPlayer().registerListener(self)
GKTurnBasedMatch.loadMatchesWithCompletionHandler({games, error in
print(games)
if games != nil {
print(games!.count)
}else {
print(error)
}
})
})
} else {
if player.authenticated == true {
GKLocalPlayer.localPlayer().registerListener(self)
GKTurnBasedMatch.loadMatchesWithCompletionHandler({games, error in
print(games) …Run Code Online (Sandbox Code Playgroud) gkturnbasedmatch ×10
ios ×9
game-center ×7
gamekit ×4
iphone ×2
objective-c ×2
callback ×1
connection ×1
ios7 ×1
nsdata ×1
null ×1
swift ×1