Как отправить пример NSString с помощью GKTank - PullRequest
0 голосов
/ 28 октября 2011

Я успешно отправляю данные int и CGPoint в структуре примера GKTank, НО я отчаянно пытался отправить NSString.Я также попробовал это с char вместо NSString, но безуспешно ...

Вот код для отправки:

NSString *playerName = @"My Name";
NSData *dat = [playerName dataUsingEncoding:NSUTF8StringEncoding];
[BTINconnector sendNetworkPacketwithPacketID:NETWORK_PLAYERNAME withData:dat ofLength:sizeof(dat) reliable:YES];

метод (известный из GKTank, модифицированный)

    - (void)sendNetworkPacketwithPacketID:(int)packetID withData:(void *)data ofLength:(int)length reliable:(BOOL)howtosend {
    //NSLog(@"bmpc:ok 3 send packet to %i",gamePeerId);
    // the packet we'll send is resued
    static unsigned char networkPacket[kMaxPacketSize];
    const unsigned int packetHeaderSize = 2 * sizeof(int); // we have two "ints" for our header

    if(length < (kMaxPacketSize - packetHeaderSize)) { // our networkPacket buffer size minus the size of the header info
        int *pIntData = (int *)&networkPacket[0];
        // header info
        pIntData[0] = gamePacketNumber++;
        pIntData[1] = packetID;
        // copy data in after the header
        memcpy( &networkPacket[packetHeaderSize], data, length ); 

        NSData *packet = [NSData dataWithBytes: networkPacket length: (length+8)];
        if(howtosend == YES) { 
            [mySession sendData:packet toPeers:[NSArray arrayWithObject:gamePeerId] withDataMode:GKSendDataReliable error:nil];
        } else {
            [mySession sendData:packet toPeers:[NSArrayarrayWithObject:gamePeerId] withDataMode:GKSendDataUnreliable error:nil];
    }
    }
}

и метод получения (из модифицированного мной GKTank)

- (void)receiveDataDG:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void *)context { 
    static int lastPacketTime = -1;
    unsigned char *incomingPacket = (unsigned char *)[data bytes];
    int *pIntData = (int *)&incomingPacket[0];
    NSData* nData = (NSData*)&incomingPacket[0];
    //NSData* bData = nData[8];
    //
    // developer  check the network time and make sure packers are in order
    //
    int packetTime = pIntData[0];
    int packetID = pIntData[1];
    if(packetTime < lastPacketTime && packetID != NETWORK_COINTOSS) {
        NSLog(@"bmc: EXITED");
        return; 
    }

    lastPacketTime = packetTime;
    switch( packetID ) {
        case NETWORK_PLAYERNAME:
        {
NSData *hjk = [NSData dataWithBytes:&pIntData[2] length:sizeof(int)];

            NSString *gotitb = [[NSString alloc] initWithData:hjk encoding:NSUTF8StringEncoding];
            NSLog(@"bmc:str %@,%@",gotitb,gotitb);
…

gotitb возвращает ноль, но я не знаю почему.Пожалуйста, помогите.

1 Ответ

0 голосов
/ 28 октября 2011

Вы не хотите sizeof(dat), вы хотите [dat length].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...