Game Center matchData的良好做法

gab*_*ata 2 nscoding nsdata gamekit ios game-center

我是GKTurnBasedMatch的新手,我正在试图找出在转弯期间玩家之间发送的"matchData"的良好做法.我发现的所有教程主要包括发送一串文本,我想发送更多.如果有人能给我一个更高级的教程,那就太好了.

我想做的一个例子就是战斗.这两个玩家有他们的化身,他们有不同的细节(健康,攻击,防御等),我该如何发送这些数据?我认为可能的唯一方法是将所有匹配细节(很多)编成NSDictionary并发送,以便它们可以再次放回到自定义匹配对象中.我应该实施NSCoding吗?

谢谢!

dan*_*ard 6

我将实现一个类,它存储单个转弯所需的所有相关信息,并让类实现NSCoding.这意味着您可以在一个播放器的设备上将对象转换为NSData,然后将其转换回另一侧的对象.

这个网站http://samsoff.es/posts/archiving-objective-c-objects-with-nscoding有一个简单的例子让你前进,这里是你需要的主要方法的一个例子:

- (id)initWithCoder:(NSCoder *)decoder {
    if (self = [super init]) {
        self.health = [decoder decodeObjectForKey:@"health"];
        self.attack = [decoder decodeObjectForKey:@"attack"];
        isDead = [decoder decodeBoolForKey:@"isDead"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:self.health forKey:@"health"];
    [encoder encodeObject:self.attack forKey:@"attack"];
    [encoder encodeBool:isDead forKey:@"isDead"];
 }
Run Code Online (Sandbox Code Playgroud)

将对象编码为NSData:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject: object];
Run Code Online (Sandbox Code Playgroud)

转换回对象:

id *object = [NSKeyedUnarchiver unarchiveObjectWithData: inputData];
Run Code Online (Sandbox Code Playgroud)

档案和序列化编程指南也是一个很好的起点.

另一个选择是使用像RestKit这样的库,它的对象映射到/来自JSON或XML.

  • 当前NSData回合制游戏大小限制为4096字节.确保保持较低的数据大小.整数需要4个字节.在一个数组中,它快速堆积起来.我最终将所有内容保存在一个字符串中,这极大地减少了数据量. (3认同)