2011-12-26 1 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을 호출하면 수신 피어의 float 값은 0입니다. 전화를 걸면 testFloat : 1.3458이면 수신 피어의 float 값은 1입니다.

피어 수신 코드에서 반올림되는 것처럼 보이지만 그 이유는 확실하지 않습니다.

플로팅을 IEEE754로 인코딩하는 것이 효과적이지만 그림을 인코딩하기 전에 이것이 작동하지 않는 이유를 알고 싶습니다.

답변

3

- (void) testFloat:(int) floatValue

... 나는 그 문제가 될 것이라고 생각 :

그것은처럼 간단 할 수있다. 이 함수가 전달되면 int로 자동 캐스팅됩니다. 이것에

변경을 :

- (void) testFloat:(float) floatValue

+0

AH! 그게 전부 였어. 내가 그것을 간과했다라고 생각할 수 없다. 감사! – gngrwzrd

-2

알림을 위해 C 스타일 구조체를 사용하지 마십시오. NSNotification의 사용자 정보 사전은 Objective C 객체로 작업하기위한 것입니다. TRMessagePushPeer 개체를 만들고 float를 멤버로 (float 또는 NSNumber 개체) 넣습니다. 당신은 메소드 선언의 int로 플로트를 캐스팅하고 -

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

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

는 사실 통지에 C 구조체를 전달하고 있지 않다. userInfo에 NSDictionary를 전달하고 있는데 거기에 NSData가 있습니다.이 NSData는 C 구조에 캐스팅 된 원시 바이트를 래핑합니다. – gngrwzrd

+0

원래 포스터가 사전에 저장하기 전에 구조체를 NSData로 변환하기 때문에이 대답이 잘못되었습니다. 따라서 사전 *은 Objective-C 객체와 함께 사용됩니다. C-Struct을 NSDictionary와 함께 사용하면 아무 문제가 없습니다. 여기에서 수행되는 것처럼 올바르게 직렬화한다고 가정하십시오. – lxt

+0

오케이. 나는 여전히 C 구조체를이 방법으로 사용하는 것이 지옥과 같은 해킹이라고 생각하지만, 나를 교정 해 주셔서 감사합니다. @lxt! –