- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在通过 gamecenter 实现一款多人模式的回合制游戏。我有 2 台设备(1 台 ipad,1 台 iphone)在沙盒模式下进行测试,它们运行良好,但最近它开始在自动配对过程中遇到困难。在我从一个用户发送第一个回合后,另一台设备不会立即识别出该游戏,而是打开自己的新游戏。在它能够立即发现游戏在另一台设备上开始之前,配对就相当简单了。我不记得更改了与配对相关的任何部分(NSCoding
、GKTurnBasedEventHandler
、GKTurnBasedMatchmakerViewControllerDelegate
委托(delegate)方法等)。
现在我从一台设备发送第一回合,需要等待大约 1 分钟,以便另一台设备可以成功连接到该游戏。连接发生后,endTurnWithMatchData 调用没有任何问题,它可以在 1-2 秒内发送和接收数据。但如果用户开始一个新游戏并且不得不等待 1 分钟以便另一个用户可以连接到他的游戏,那么这将不是一个好的用户体验。有没有人在汽车配对过程中遇到明显的滞后?我还没有实现邀请,所以我无法检查。我用 NSKeyedArchiver 存档的匹配数据似乎很大,有 3396 字节,即使对于几乎没有数据的新游戏也是如此。以下是我的代码的相关部分:
GameOptionsViewController
:
- (void)turnBasedMatchmakerViewControllerWasCancelled:(GKTurnBasedMatchmakerViewController *)viewController
{
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)turnBasedMatchmakerViewController:(GKTurnBasedMatchmakerViewController *)viewController didFailWithError:(NSError *)error
{
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)turnBasedMatchmakerViewController:(GKTurnBasedMatchmakerViewController *)viewController didFindMatch:(GKTurnBasedMatch *)match
{
[self dismissViewControllerAnimated:NO completion:nil];
self.gcMatch = match;
[self performSegueWithIdentifier:@"GameMultiplayer" sender:self];
}
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([segue.identifier isEqualToString:@"GameMultiplayer"])
{
GameViewController *GameVC = (GameViewController *)segue.destinationViewController;
[GameVC setGameMode:GAMEMODE_MULTIPLAYER_SAMEDEVICE];
//Multiplayer game it is
if(self.gcMatch != nil)
{
[GameVC setGameMode:GAMEMODE_MULTIPLAYER_GAMECENTER];
GameVC.gcMatchDelegate = self;
GameVC.gcMatch = self.gcMatch;
NSLog(@"Game OVC Segue: Match ID | %@", self.gcMatch.matchID);
}
}
else
{
...
}
}
GameViewController
:
//This method is called according to user actions
//It's the only method I use to send data to other participant
-(void) sendCurrentGameDataWithNewTurn:(BOOL) newTurn
{
NSLog(@"Sending game data current participant : %@", gcMatch.currentParticipant.playerID);
//Update match data if it is corrupted anyhow
if (gcMatch.currentParticipant == nil)
{
[GKTurnBasedMatch loadMatchWithID:gcMatch.matchID withCompletionHandler:^(GKTurnBasedMatch *match, NSError *error)
{
if (error != nil)
{
NSLog(@"Error :%@", error);
return ;
}
[self sendCurrentGameDataWithNewTurn:newTurn];
}];
}
else
{
NSData *matchData = [NSKeyedArchiver archivedDataWithRootObject:game];
//Game advances to new player, buttons are disabled
if(newTurn)
{
NSLog(@"SENDING NEW TURN");
NSUInteger currentIndex = [gcMatch.participants
indexOfObject:gcMatch.currentParticipant];
GKTurnBasedParticipant *nextParticipant;
nextParticipant = [gcMatch.participants objectAtIndex:
((currentIndex + 1) % [gcMatch.participants count])];
[gcMatch endTurnWithNextParticipants:[NSArray arrayWithObject:nextParticipant] turnTimeout:GC_TURN_TIMEOUT matchData:matchData completionHandler:^(NSError *error) {
NSLog(@"Sent");
if (error) {
NSLog(@"SNT - %@", error);
}
}];
}
else
{
NSLog(@"ONLY UPDATING DATA");
[gcMatch saveCurrentTurnWithMatchData:matchData completionHandler:^(NSError *error) {
NSLog(@"Sent");
if (error) {
NSLog(@"OUD - %@", error);
}
}];
}
}
-(void) updateGameDataWithGCMatch
{
//Update whole game data
self.game = [NSKeyedUnarchiver unarchiveObjectWithData:self.gcMatch.matchData];
//Update game ui
...
}
-(void) handleTurnEventForMatch:(GKTurnBasedMatch *)match didBecomeActive:(BOOL)didBecomeActive
{
//Check if I got data for the currently active match that options vc forwarded me here, if not do some debug print and return
if(![self.gcMatch.matchID isEqual:match.matchID])
{
//For debugging reasons I skip if i get info for any previous match (other player quit etc)
NSLog(@"GCMatch matchID: %@ match matchID: %@",self.gcMatch.matchID,match.matchID);
return;
}
NSLog(@"Turn event handle");
self.gcMatch = match;
if([match.currentParticipant.playerID isEqualToString: [GKLocalPlayer localPlayer].playerID ])
{
//Disable field buttons
[self setFieldButtonsEnabled:TRUE];
[self turnChangeAnimationFromLeftToRight:FALSE];
}
[self updateGameDataWithGCMatch];
}
最佳答案
关于你的问题:
我自己在 Game Center 上对匹配进行了相当多的锻炼,也经常遇到延迟,这已被证明不是我的网站造成的,而是苹果游戏中心服务器造成的。
至于额外的指导:
据我所知,您目前在设备上进行匹配的方法是:
看看是否有我可以连接的比赛 --> 如果是,请求游戏数据并连接到比赛,否则开始你自己的比赛并广播比赛数据
根据我的经验,更好的做法是从 matchrequestbroadcasts 开始,等到找到第二个玩家,定义服务器设备(例如,通过游戏中心名称的较低校验和),然后在该设备上开始游戏。
关于iphone - Game Center 对接会 GKTurnBasedMatch 有明显滞后(约 1 分钟),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15616593/
我正在开发一款游戏包回合制比赛。这是一个不同语言的文字游戏。 玩家可以选择为他想玩的每个游戏设置语言。我想使用 GKMatchRequest 的 playergroup 属性来区分语言。 但是在发送
我正在开发一款回合制 Game Kit 游戏。我正在为玩家参与的比赛制作自定义用户界面。我使用 loadMatchesWithCompletionHandler: 有一个用例,用户正在进行一场比赛,还
所以我的比赛有两名球员。当玩家 1 创建新的比赛时,我使用 endTurnWithNextParticipants 方法并为 nextParticipants 提供 GKTurnBasedMatch
假设我有一个有 2 名玩家的 GKTurnBasedMatch,而第二个玩家在他的回合内就被放弃了。我该如何向第一个用户显示游戏已经结束的信息?或者也许让第一个玩家以编程方式退出? 另一场 GKTur
使用 GameKit 的标准用户界面以编程方式接受匹配邀请的正确方法是什么? 我看到一个expectedState="Invited"foundState="Active" 异常 Optional(E
我正在尝试实现一个基于回合的应用程序,发送回合数据没有问题,但我看不到自动接收数据的方法。到目前为止,我发现了这么多: 有一个 GKTurnBasedEventHandlerDelegate 协议(p
当用户在使用 GameKit 的 iOS 应用中“依次”退出基于回合的比赛时,委托(delegate)方法 -(void)turnBasedMatchmakerViewController: (GKT
我正在使用 Game Center 的回合制比赛构建游戏。 我想显示所有可用匹配项的列表。我试过使用 loadMatchesWithCompletionHandler(),但游戏数组返回为 nil,错
我正在测试两台设备之间的回合制游戏。据我了解,例如,发送带有 [GKTurnBasedMatch endTurnWithNextParticipants:] 的回合应该会自动将游戏中心通知推送给对手。
我正在做一些实验来尝试了解 GameKit,我制作了一个简单的游戏和一个列出我的玩家比赛的界面。我正在尝试添加在比赛中使用 removeWithCompletionHandler: 方法删除游戏的功能
我正在尝试向 GKTurnBasedMatch 中的另一个玩家发送交换。当我发送它时,我的完成处理程序收到一条大错误消息,其中包含以下描述: The requested operation could
来自苹果的Class Reference ,我了解 GKTurnBasedMatch 的 participants 属性具有在比赛开始时确定的固定大小。此外,据我所知,参与者允许的最大人数为 16 名
我正在编写回合制游戏的多人游戏部分,我正在使用游戏中心来管理比赛。使用 GKTurnBasedMatch 开始新游戏不会立即向其他玩家发送邀请通知。要发送通知,我必须采取行动并结束第一回合...我可以
我正在使用游戏中心制作游戏应用。 我想问一下在应用程序中保存整个对象(GKTurnBasedMatch)等游戏数据的最佳做法是什么? 因为,每个匹配项都有一个 matchData。我打算将这个 GKT
当我创建以下 GKRequest 对象以创建回合制游戏时: GKMatchRequest *gameRequest = [[GKMatchRequest alloc] init]; gameReque
我正在开发棋盘游戏。使用 Game Center 进行多人游戏,但目前卡在如何发送或接收 GKTurnBasedMatch 的邀请。我正在使用以下方式以编程方式创建匹配: GKMatchRequest
我一直在寻找关于这个问题的明确答案,但我得到了一些不一致的答案。 Apple 文档声明 64k 字节。但是,在网上我发现有多个来源说 4k 字节是最大值。这是 iOS 5 和 iOS 6 之间的区别吗
我正在创建一个带有菜单屏幕的简单文字游戏,其中显示了用户的所有事件匹配项。我想按照从最近到最近最不活跃的顺序对这组比赛进行排序,但是与玩家轮流相关的唯一时间戳属性是 GKTurnBasedPartic
假设有一个 GKTurnBasedMatch 只剩下 2 名尚未退出的参与者。 如果当前参与者想退出,而不是调用 participantQuitInTurnWithOutcome:... 调用 end
我想允许我的游戏玩家加入特定的比赛。例如,PlayerA 通过 findMatchForRequest 启动了一个 GKTurnBasedMatch。然后他希望他的 friend 加入,但不是希望他的
我是一名优秀的程序员,十分优秀!