0

GameCenter を使用して 2 つのデバイス間でマッチメイキングを行った後、情報を送受信する際に発生した Objective-C の問題を誰かが解決してくれることを期待していました。

Beginning iOS Game Center and Game Kit という教科書を参考にして、サンプルプログラムを進めているのですが、ゲームをプレイしている端末からデータを受け取りたい部分で行き詰っています。

2 つのデバイスと表示される適切なビューを正常に一致させることができます。私の GameCenterManager.m ファイルには、情報を送信するための 2 つの関数があります。1 つは次のとおりです。

- (void)sendStringToAllPeers:(NSString *)dataString reliable:(BOOL)reliable
{
NSLog(@"Send String To All Peers");
NSLog(@"Data String: %@", dataString);
NSLog(@"match or session %@", self.matchOrSession);

if (self.matchOrSession == nil)
{
    NSLog(@"GC Manager matchorsession ivar was not set - this needs to be set with the GKMatch or GKSession before sending or receiving data");
    return;
}
NSData *dataToSend = [dataString dataUsingEncoding:NSUTF8StringEncoding];
GKSendDataMode mode;
if (reliable)
{
    mode = GKSendDataReliable;
}
else{
    mode = GKSendDataUnreliable;
}

NSError *error = nil;
if ([self.matchOrSession isKindOfClass:[GKSession class]])
{
    NSLog(@"Match or session 1");
    NSLog(@"Data to send: %@", dataToSend);
    [self.matchOrSession sendDataToAllPeers:dataToSend withDataMode:mode error:&error];

}

else if ([self.matchOrSession isKindOfClass:[GKMatch class]])
{
    NSLog(@"Match or session 2");
    NSLog(@"Data to send: %@", dataToSend);
    [self.matchOrSession sendDataToAllPlayers:dataToSend withDataMode:mode error:&error];
}

else
{   
    NSLog(@"GC Manager matchOrSession was not a GKMatch or a GK Session, we are unable to send data");
}

if (error != nil)
{
NSLog(@"An error occurred while sending data %@", [error localizedDescription]);

}
}

この関数は、racetohundredViewController.m ファイルの関数から呼び出します。

- (void)generateAndSendHostNumber;
{
NSLog(@"Generate and send host number");
randomHostNumber = arc4random();
NSString *randomNumberString = [NSString stringWithFormat: @"$Host:%f", randomHostNumber];
NSLog(@"the random number string is: %@", randomNumberString);
[self.gcManager sendStringToAllPeers:randomNumberString reliable: YES];
}

これにより、次の NSLog 出力が正常に取得されます。

2013-01-02 22:27:43.519 First to 50[1376:907] Send String To All Peers
2013-01-02 22:27:43.520 First to 50[1376:907] Data String: $Host:2087825492.000000
2013-01-02 22:27:43.521 First to 50[1376:907] match or session <GKMatch 0x200853d0 expected count: 0 seqnum: 2
G:1656671636:connected
reinvitedPlayers:(
)>
2013-01-02 22:27:43.522 First to 50[1376:907] Match or session 2
2013-01-02 22:27:43.523 First to 50[1376:907] Data to send: <24486f73 743a3230 38373832 35343932 2e303030 303030>

だから私は素晴らしい「送信するデータ」出力を見ることができます。

しかし、私は今コマンドを持っています

[self.matchOrSession sendDataToAllPeers:dataToSend withDataMode:mode error:&error];

それは私をどこにも連れて行ってくれないようです。GameCenterManager.m に次の関数があります。

- (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context
{
NSLog(@"*****Receive Data In Session");
NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSDictionary *dataDictionary = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:dataString, peer, session,  nil] forKeys:[NSArray arrayWithObjects: @"data", @"peer", @"session", nil]];

[self callDelegateOnMainThread: @selector(receivedData:) withArg: dataDictionary error: nil];
}

しかし、これからの NSLog 出力が表示されません。同様に、racetohundredViewController.m ファイルに関数があります。

- (void)receivedData:(NSDictionary *)dataDictionary
{
    NSLog(@"------Received Data");
}

これも呼び出されません。おそらく、前の関数がそれを呼び出すことができないためです。

なぜこれがしばらくうまくいかないのかを調べてみましたが、役に立ちませんでした。誰かが私が間違っているところを指摘できますか? 関連するすべてのコードを入力したことを願っていますが、質問がある場合は質問してください。

よろしくお願いします。

4

1 に答える 1

0

同じことで他の人々の問題をオンラインで見た後、私は自分が何をしたかを理解しました. マッチを見つけた後、デリゲートを設定していませんでした。これは非常に初歩的なミスです。

于 2013-01-02T23:57:33.603 に答える