2

問題の概要

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

  • プロセス全体を間違って実行している可能性があります

招待を処理するための私のプロセス

  1. デバイス A のマッチ メーカーが招待に関する通知をデバイス B に送信する
  2. デバイス B が開き、マッチ メイキング ルームにリダイレクトされます
  3. デバイス 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];

  }

}

  1. 両方のデバイスが次の関数を呼び出します。

{

-(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];
    }
}
}

}

  1. デバイス 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]);
}
}

}

助けてくれてありがとう :)

4

1 に答える 1

0
  • GKMatch プロパティが (割り当て) に設定されていましたが、(保持) に変更する必要がありました
  • GKMatch オブジェクトを使用できるように、開始時に nil に初期化する必要がありました
于 2015-06-14T00:05:28.860 に答える