gpt4 book ai didi

iphone - Game Center - 发送和接收数据

转载 作者:太空狗 更新时间:2023-10-30 03:39:51 26 4
gpt4 key购买 nike

编辑:我做了一个干净的新项目,但仍然无法正常工作。请下载它,有一些代码可供查看,专业人士或任何远程经验的人都可以轻松查看我做错了什么。只是想发送那个整数。

http://www.2shared.com/file/fPOCLlg5/gkTest.html

你好

我正在尝试在我的 iPhone 游戏中实现 Game Center 多人游戏,但无法理解我手头的 Apple Docs 示例以及来自第三方的有关发送和接收数据的示例。

有人可以在这里解释官方 Apple 文档中的代码示例吗: http://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/GameKit_Guide/MatchesandVoice/MatchesandVoice.html#//apple_ref/doc/uid/TP40008304-CH10-SW4

或者帮我弄清楚我提供的这个示例代码。它是一个预建类,用于处理所有游戏中心任务,其中用于发送和接收数据的示例如下:

- (void) sendPosition
{
NSError *error;
PositionPacket msg;
msg.messageKind = PositionMessage;
msg.x = currentPosition.x;
msg.y = currentPosition.y;
NSData *packet = [NSData dataWithBytes:&msg length:sizeof(PositionPacket)];
[match sendDataToAllPlayers: packet withDataMode: GKMatchSendDataUnreliable error:&error];
if (error != nil)
{
// handle the error
}
}

并接收:

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID
{
Packet *p = (Packet*)[data bytes];
if (p.messageKind == PositionMessage)
// handle a position message.
}

关于官方文档中的这段代码,我最大的问题是:

PositionPacket/Packet从哪里来?并假设当您想要发送/接收数据时,您会这样调用它们:

[self sendPosition];

[self match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID];

我应该输入什么作为比赛、数据和球员 ID?

例如我有一个名为“score”的整数,但是否没有我需要使用某些东西的特殊键?

最佳答案

在此示例中,PositionPacket 只是一个结构。接下来的行将该结构放入一个 NSData 中,它只是一个“字节桶”对象。

NSData *packet = [NSData dataWithBytes: &msg length: sizeof(PositionPacket)];

因此,如果您只想发送一个 int 分数,您可以使用如下所示的 sendScore 方法:

- (void) sendScore
{
NSError *error;
int myScore = self.score;
NSData *packet = [NSData dataWithBytes:&myScore length:sizeof(myScore)];
[match sendDataToAllPlayers: packet withDataMode: GKMatchSendDataUnreliable error: &error];
if (error != nil)
{
// handle the error
}
}

通常,您需要一个结构,以便有一些额外的信息让接收者知道它是什么类型的数据。在这个例子中,这就是这一行的目的:

msg.messageKind = PositionMessage;

通常,您可以发送任何您想要封装在 NSData 对象中的内容,因为它只是一个字节桶。您可以发送基本类型,例如 int 或示例中的结构,甚至 NSObjects(只要它们实现了 NSCoding)。您应该阅读 NSKeyedArchiver、NSCoding 和 NSData 以获取有关以这种方式发送和接收 NSObject 的更多信息。这是 Apple 关于 Archving 的引用文档.

至于接收,你不用调用方法,它会被 Kit 调用给你。这就是所谓的“委托(delegate)方法”(用 Cocoa 的说法)或“回调方法”。您可以将其视为您的应用可以异步接收的“电话”。通过实现带有签名的方法:

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID;

...你在说“我可以接到这种电话”。因此,当 GameKit 代表您从另一个玩家接收数据时,它会看到您想要接收那种回调,然后调用该方法——然后由您根据接收到的内容更新您的内部应用程序状态。

继续这个例子,如果你发送了上面描述的简单的“nothing but an integer”消息,你可以像这样实现这个方法:

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID
{
int* receivedScorePtr = (int*)[data bytes];
int receivedScore = *receivedScorePtr;
[self updateScore: received forPlayer: playerID];
}

也就是说,当然,假设您有一个名为 updateScore:forPlayer: 的方法,它会更新分数表。

您可以在此博客条目中找到关于委托(delegate)和委托(delegate)方法如何工作的更一般性讨论/解释:http://mohrt.blogspot.com/2010/01/cocoa-and-delegates.html

添加:使用提问者发布的代码,我进行了一些修改并生成了一个“适用于”这个基本用例的版本。 Working Version of Test App To Send One Integer Through GameCenter我对代码的质量或其适用性不作任何声明。 99.9% 的内容不是我写的 - 请不要把我在这里发布它作为对其中出现的任何内容的认可。

一个教训(我不知道,所以我把它放在这里希望它能帮助其他人)是你不能在模拟器上使用配对服务。这意味着您需要两台开发配置的 iOS 设备来测试这种情况,并且对于重要的程序,可能需要两台开发机器来同时调试这两个设备。在解决这个问题时,这个问题花费了我最多的时间。

关于iphone - Game Center - 发送和接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4574119/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com