我正在实现一个多人游戏,我必须使用以下方式在玩家之间发送数据:
[self sendData:data mode:GKMatchSendDataReliable];
而不是像本教程中那样使用多个 c-structs ( http://www.raywenderlich.com/3325/how-to-make-a-simple-multiplayer-game-with-game-center-tutorial-part-22 ) ,我创建了一个 Message 对象和一个名为 Submessage 的 Message 子类。创建了子类,因此我避免在每条消息中发送不必要的变量,以最小化发送的每个数据包的大小。然后我使用 NSCoding 对消息进行编码和解码。
这些类如下所示:
消息.h
@interface Message : NSObject <NSCoding>
@property int messageType;
- (void)encodeWithCoder:(NSCoder*)coder;
- (id)initWithCoder:(NSCoder*)coder;
消息编码器方法
-(void) encodeWithCoder:(NSCoder *)coder{
[coder encodeInt:messageType forKey:@"messageType"];
}
-(id)initWithCoder:(NSCoder *)coder {
self = [super init];
messageType = [coder decodeIntForKey:@"messageType"];
return self;
}
子消息.h
@interface Submessage : Message <NSCoding>
@property float additionalParameter1;
- (void)encodeWithCoder:(NSCoder*)coder;
- (id)initWithCoder:(NSCoder*)coder;
子消息编码器方法
- (void)encodeWithCoder:(NSCoder *)coder{
[super encodeWithCoder:coder];
[coder encodeFloat:additionalParameter1 forKey:@"float"];
}
- (id)initWithCoder:(NSCoder *)coder {
self = [super init];
[self initWithCoder:coder];
floatParameter1 = [coder decodeFloatForKey:@"floatParameter1"];
return self;
}
收到数据后,我使用以下方法将其取消归档:
Message *thisMessage = [NSKeyedUnarchiver unarchiveObjectWithData:data];
但是,当我发送子消息时,这不起作用。如何确定数据是消息类型还是子消息类型?我应该如何实现它才能像在 c-struct 案例中一样工作?