2011-12-26 6 views
0

私はプロトタイプゲームを構築しており、いくつかのマルチプレイヤー機能を接続しています。私はワイヤで浮動小数点を送信する問題に遭遇しています。誰かがこの問題を抱えているかどうか不思議で、問題が何であるか教えてください。iOS 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でエンコードしても問題ありませんが、エンコードする前にこれが動作しない理由を知りたいと思います。

答えて

3

- (void) testFloat:(int) floatValue

...私はそれはあなたの問題だと思う - あなたはメソッド宣言のintとしてあなたのフロートをキャストしています。それが渡されると、自動的にintにキャストされます。これを見たらあなたはおそらくあなた自身を蹴散らすでしょう!これに

変更を:

- (void) testFloat:(float) floatValue

+0

AH!それは完全にそれでした。私はそれを見落として信じられない。ありがとう! – gngrwzrd

-2

通知にCスタイルの構造体を使用しないでください。 NSNotificationのユーザー情報辞書は、Objective Cオブジェクトで動作するようになっています。 TRMessagePushPeerオブジェクトを作成し、フロートをメンバー(floatまたはNSNumberオブジェクト)として配置します。

それはのように簡単になります

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

@property (nonatomic, readwrite) float force; 
+0

私は実際に通知にCの構造体を渡していませんよ。私はuserInfoのNSDictionaryを渡しています。その中にNSDataがあります。これは、C構造体にキャストした生のバイトをラップするものです。 – gngrwzrd

+0

元のポスターがその構造体を辞書に保存する前に 'NSData'に変換しているので、この回答は間違っています。ですから、辞書*はObjective-Cオブジェクトで使用されています。 'NSDictionary'でC-Structを使っても問題ありません。あなたがここで行われているように正しくシリアライズしていると仮定します。 – lxt

+0

私はまだCの構造体をこの方法で使用することは、地獄と同様にハッピーだと思うが、@ lxtを修正してくれてありがとう! –

関連する問題