iOS GameKit: отправка поплавков по проводам - PullRequest
0 голосов
/ 27 декабря 2011

Я создаю прототип игры и подключил несколько многопользовательских функций. Я столкнулся с проблемой с отправкой поплавка по проводам, хотя. Любопытно, сталкивался ли кто-нибудь с этим, или может сказать мне, в чем проблема.

Структура, которую я отправляю, выглядит следующим образом:

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 ]

3 голосов
/ 27 декабря 2011

- (void) testFloat:(int) floatValue

... Я думаю, что это будет вашей проблемой - вы приводите свой float как int в объявлении метода.Когда оно будет передано, оно будет автоматически приведено к int. Вы, вероятно, ударите себя, когда увидите это!

Измените его на:

- (void) testFloat:(float) floatValue

0 голосов
/ 27 декабря 2011

Не используйте структуру в стиле C для уведомлений.Словарь информации пользователя NSNotification предназначен для работы с объектами Objective C.Создайте объект TRMessagePushPeer и поместите объект с плавающей точкой как член (объект с плавающей точкой или NSNumber).

Это может быть просто:

@interface TRMessagePushPeer : NSObject
{
  TRMessageHeader header;
  float force;
}

@property (nonatomic, readwrite) float force;
...