我正在构建一个原型游戏,并且已经连接了一些多人游戏功能。我遇到了通过电线发送浮动的问题。好奇,如果有人碰到这个,或者可以告诉我这是什么问题。
我发送的结构如下:
struct TRMessageHeader {
int length;
int code;
};
struct TRMessagePushPeer {
struct TRMessageHeader header;
float force;
};
我通过网络发送的代码如下所示:
- (void) testFloat:(int) floatValue {
struct TRMessagePushPeer message = {0};
message.header.code = TRMessageCodePushPeer;
message.header.length = sizeof(message);
message.force = floatValue;
NSArray * peers = [_session peersWithConnectionState:GKPeerStateConnected];
NSData * data = [NSData dataWithBytes:&message length:sizeof(message)];
NSError * error = NULL;
[_session sendData:data toPeers:peers withDataMode:GKSendDataReliable error:&error];
}
我的接收代码如下:
- (void) onPeerPushed:(NSNotification *) notification {
NSDictionary * userInfo = [notification userInfo];
NSData * messageData = [userInfo objectForKey:@"messageData"];
struct TRMessagePushPeer * message = (struct TRMessagePushPeer *)[messageData bytes];
NSLog(@"peer sent float :%f",message->force);
}
所以我遇到的问题是如果我调用testFloat:0.4573,那么接收对等体的浮点值为0.如果我调用testFloat:1.3458那么接收对等体的浮点值是1。
所以它似乎在同行接收代码中向下舍入,但我不确定原因。
我想用IEEE754对浮点数进行编码会有效,但我想知道为什么在我编码之前它不会像以前一样工作。
答案 0 :(得分:3)
- (void) testFloat:(int) floatValue
...我认为这将是你的问题 - 你在方法声明中将你的浮动作为int转换。传入时它会自动转换为int。一旦你看到它,你可能会踢自己!
将其更改为:
- (void) testFloat:(float) floatValue
答案 1 :(得分:-2)
不要使用C风格的结构来进行通知。 NSNotification的用户信息字典旨在与Objective C对象一起使用。创建一个TRMessagePushPeer
对象并将float作为成员(浮点数或NSNumber
对象)放入。
可以这么简单:
@interface TRMessagePushPeer : NSObject
{
TRMessageHeader header;
float force;
}
@property (nonatomic, readwrite) float force;