我计划开发一款回合制游戏,并试图了解如何与游戏中心进行通信以及发送和接收马赫数据。我已经阅读了它并对它进行了几天的测试,并且无法让它按计划运行。
我尝试使用下面的代码唯一能够保存然后读取马赫数据。我正在使用两个沙盒游戏中心帐户进行转弯。
按下“endTurn”按钮,转弯发送相同的数据。每次我运行实际用户都经过身份验证,应用程序设置正确(我相信)。
这是一个测试应用程序没有任何其他目的,而不是测试我说的。下面是我用于匹配数据处理的代码。
我真的很感激我可能做错的任何想法和提示。在我开始认真测试之前,我确实发布了一个类似的问题,但没有解决这个问题,https://stackoverflow.com/questions/14447392/start-gamecenter-turn-based-match-and-initiate-match-data-for-the-very-first-tim。
我也试图抓住参与者,但没有成功,这可能意味着处理完成处理程序时会出现问题。
-(IBAction)endTurn:(id)sender {
[_gameDictionary setObject:@"The Object" forKey:@"The Key"];
NSLog(@"_gameDictionary: %@", _gameDictionary);
NSData *data = [NSPropertyListSerialization dataFromPropertyList:_gameDictionary format:NSPropertyListXMLFormat_v1_0 errorDescription:nil];
GKTurnBasedParticipant *nextPlayer;
if (_match.currentParticipant == [_match.participants objectAtIndex:0]) {
nextPlayer = [[_match participants] lastObject];
} else {
nextPlayer = [[_match participants]objectAtIndex:0];
}
NSLog(@"_match.currentParticipant: %@", _match.currentParticipant);
[self.match endTurnWithNextParticipant:nextPlayer matchData:data completionHandler:^(NSError *error) {
if (error) {
NSLog(@"An error occured updating turn: %@", [error localizedDescription]);
}
[self.navigationController popViewControllerAnimated:YES];
}];
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
_gameDictionary = [[NSMutableDictionary alloc]init];
[self.match loadMatchDataWithCompletionHandler:^(NSData *matchData, NSError *error) {
NSDictionary *myDict = [NSPropertyListSerialization propertyListFromData:_match.matchData mutabilityOption:NSPropertyListImmutable format:nil errorDescription:nil];
[_gameDictionary addEntriesFromDictionary: myDict];
if (error) {
NSLog(@"loadMatchData - %@", [error localizedDescription]);
}
}];
NSLog(@"_gameDictionary: %@", _gameDictionary);
}
输出:
"gk-cdx" = "17.173.254.218:4398";
"gk-commnat-cohort" = "17.173.254.220:16386";
"gk-commnat-main0" = "17.173.254.219:16384";
"gk-commnat-main1" = "17.173.254.219:16385";
}
2013-02-11 22:44:11.707 GC_test1[8791:14f03] _gameDictionary: {
}
2013-02-11 22:44:13.894 GC_test1[8791:14f03] _gameDictionary: {
The Object = The Key;
}
2013-02-11 22:44:13.894 GC_test1[8791:14f03] _match.currentParticipant: (null)
答案 0 :(得分:0)
_match.currentParticipant
评估为nil
的事实令人不安。我怀疑_match
从未初始化,或nil
,或者它不是从游戏中心设施获得的,例如loadMatchesWithCompletionHandler:
,GKTurnBasedMatchmakerViewController
或使用{{ 1}}。
对于新匹配,如果通过任何这些设施创建,findMatchForRequest:withCompletionHandler:
将保证代表本地玩家。您不能自己实例化currentParticipant
。
要解决此问题,至少要进行测试,您可以在GKTurnBasedMatch
的完成处理程序中分配新的_match
。只有这样才能让你按下测试按钮。