iOS GameKit:通过线路发送浮动

时间:2011-12-26 20:42:14

标签: ios floating-point gamekit

我正在构建一个原型游戏,并且已经连接了一些多人游戏功能。我遇到了通过电线发送浮动的问题。好奇,如果有人碰到这个,或者可以告诉我这是什么问题。

我发送的结构如下:

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对浮点数进行编码会有效,但我想知道为什么在我编码之前它不会像以前一样工作。

2 个答案:

答案 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;