在 ios 中使用游戏中心在多人游戏中将 NSDATA 从 32 位发送到 64 位
Sending NSDATA from 32bit to 64bit in multiplayer game using Game centre in ios
我正在使用游戏中心开发多人游戏,如果我的两个设备都是 64 位或 32 位,则总体代码运行良好,但如果我的一个设备是 32 位,另一个是 64 位,则发送数据不正确,请帮助我,
提前致谢
- (void)sendDataToPlayers:(void *)data length:(NSInteger)length
{
NSError *error = nil;
NSLog(@"lenth %i",(int)data);
NSData *package = [NSData dataWithBytes:data length:length];
[self.currentMatch sendDataToAllPlayers:package withDataMode:GKMatchSendDataReliable error:&error];
[self setLastError:error];
}
- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID
{
[self.transportDataDelegate onReceivedData:data fromPlayer:playerID];
}
我解决了这个问题,通过改变数据包的格式,我发送了用户定义的结构,它具有不同的数据类型,如整数和字符,当它发送到另一个播放器并从 NSdata 解码时,它接收到的不是零和空,
我像现在发送 NSString 一样更改我的数据包格式,
NSString *moveString =[ NSString stringWithFormat:@"/,%i,%i,%i,%i",oMoveMade.getFrom(),oMoveMade.getTo(),oMoveMade.getFromsquare(),oMoveMade.getTosquare()];
NSString *temp = [ NSString stringWithFormat:@"%i,", oMoveMade.getFrom()];
[moveString stringByAppendingString:temp];
[moveString stringByAppendingString:[ NSString stringWithFormat:@"%i,",oMoveMade.getTo()]];
[moveString stringByAppendingString:[ NSString stringWithFormat:@"%i,", oMoveMade.getFromsquare()]];
[moveString stringByAppendingString:[ NSString stringWithFormat:@"%i", oMoveMade.getTosquare()]];
NSLog(@"movestring %@",moveString);
NSData *package = [moveString dataUsingEncoding:NSUTF8StringEncoding];
[self.currentMatch sendDataToAllPlayers:package withDataMode:GKMatchSendDataReliable error:&error];
这不完全是解决方案,但就我而言,它解决了我的问题,如果有人有更好的解决方案,欢迎帮助我们
例如,您可以查看 NSJSONSerialization,它允许您以 100% 可移植的方式将包含字典、数组、数字、字符串和 NSNull 值的任何字典或数组转换为 NSData。有一种方法可以将字典或数组转换为 NSData,另一种方法可以将 NSData 转换回完全相同的字典或数组。
我正在使用游戏中心开发多人游戏,如果我的两个设备都是 64 位或 32 位,则总体代码运行良好,但如果我的一个设备是 32 位,另一个是 64 位,则发送数据不正确,请帮助我,
提前致谢
- (void)sendDataToPlayers:(void *)data length:(NSInteger)length
{ NSError *error = nil;
NSLog(@"lenth %i",(int)data);
NSData *package = [NSData dataWithBytes:data length:length];
[self.currentMatch sendDataToAllPlayers:package withDataMode:GKMatchSendDataReliable error:&error];
[self setLastError:error];
} - (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID {
[self.transportDataDelegate onReceivedData:data fromPlayer:playerID];
}
我解决了这个问题,通过改变数据包的格式,我发送了用户定义的结构,它具有不同的数据类型,如整数和字符,当它发送到另一个播放器并从 NSdata 解码时,它接收到的不是零和空,
我像现在发送 NSString 一样更改我的数据包格式,
NSString *moveString =[ NSString stringWithFormat:@"/,%i,%i,%i,%i",oMoveMade.getFrom(),oMoveMade.getTo(),oMoveMade.getFromsquare(),oMoveMade.getTosquare()];
NSString *temp = [ NSString stringWithFormat:@"%i,", oMoveMade.getFrom()];
[moveString stringByAppendingString:temp];
[moveString stringByAppendingString:[ NSString stringWithFormat:@"%i,",oMoveMade.getTo()]];
[moveString stringByAppendingString:[ NSString stringWithFormat:@"%i,", oMoveMade.getFromsquare()]];
[moveString stringByAppendingString:[ NSString stringWithFormat:@"%i", oMoveMade.getTosquare()]];
NSLog(@"movestring %@",moveString);
NSData *package = [moveString dataUsingEncoding:NSUTF8StringEncoding];
[self.currentMatch sendDataToAllPlayers:package withDataMode:GKMatchSendDataReliable error:&error];
这不完全是解决方案,但就我而言,它解决了我的问题,如果有人有更好的解决方案,欢迎帮助我们
例如,您可以查看 NSJSONSerialization,它允许您以 100% 可移植的方式将包含字典、数组、数字、字符串和 NSNull 值的任何字典或数组转换为 NSData。有一种方法可以将字典或数组转换为 NSData,另一种方法可以将 NSData 转换回完全相同的字典或数组。