問題の概要
gamecenter を使用してフレンドとリアルタイムでプレイしようとすると、ゲームプレイ中にクラッシュする
プロジェクトの詳細
- cocos2dxでgamecenterを使用しています
- サンドボックス モードを使用しています: テスト中の両方のアカウントがサンドボックス モードです
- 2 台の iPad をテストに使用 (IOS 8.3)
- GKMatchMaker を使用してプレイヤーをマッチングしています
- 「ランダム」または「今すぐプレイ」によるリアルタイム マッチは問題なく動作します
- 'Invite a Friend' のリアルタイム マッチは正常にマッチしますが、GKMatch オブジェクトにアクセスするとクラッシュします
- 信頼できる方法または信頼できない方法を使用してデータを送信するとクラッシュが発生する (Invite のみ)
私の調査
- 試合中に GKMatch にアクセスすると、EXC_BAD_ACCESS が作成されます
- 次の関数でアクセスしたときに、一致する変数に割り当てられた値が null または無効ではありません:
-(void)matchmakerViewController: (GKMatchmakerViewController *) viewController didFindMatch:(GKMatch *)match
- プロセス全体を間違って実行している可能性があります
招待を処理するための私のプロセス
- デバイス A のマッチ メーカーが招待に関する通知をデバイス B に送信する
- デバイス B が開き、マッチ メイキング ルームにリダイレクトされます
- デバイス B は次の関数を呼び出します。
{
-(void)player:(GKPlayer *)player didAcceptInvite:(GKInvite *)invite {
self->inviteStarted((int)invite.playerGroup);
NSLog(@"didAcceptInvite");
//Called when another player accepts a match invite from the local player.
NSLog(@"didAcceptInvite was called: Player: %@ accepted our invitation", player);
GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithInvite:invite] autorelease];
mmvc.matchmakerDelegate = self;
[[AppController getViewController] presentViewController:mmvc animated:YES completion:nil];
}
}
- 両方のデバイスが次の関数を呼び出します。
{
-(void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)match
{
if (match != nil)
{
[[AppController getViewController] dismissViewControllerAnimated:YES completion:nil];
NSLog(@"%@", match);
self->myMatch = match;
//NSLog(@"Match found count!! %lu", (unsigned long)[self->myMatch retainCount]);
match.delegate = self;
if (!self->matchStarted && myMatch.expectedPlayerCount == 0)
{
self->matchStarted = YES;
opponent=[[myMatch players] objectAtIndex:0];
self->matchBegan();
[self loadOppPhoto];
}
}
}
}
- デバイス A がデバイス B にデータを送信(ここでクラッシュが発生)
{ -(void) sendDataToOppUnreliable:(NSString*)str
{
NSError *error=nil;
NSData *packet = [str dataUsingEncoding:NSUTF8StringEncoding];
//NSLog(@"this: %@", self);
//NSLog(@"Match found count!! %lu", (unsigned long)[self->myMatch retainCount]);
//NSLog(@"match: %@", self->myMatch);//EXC_BAD_ACCESS
[myMatch sendDataToAllPlayers: packet withDataMode:
GKMatchSendDataUnreliable error:&error];// EXC_BAD_ACCESS
if (error!=nil)
{
NSLog(@"Error in sending data: %li", (long)[error code]);
}
}
}
助けてくれてありがとう :)