Search code examples
ioscocos2d-iphoneintegernsarraygksession

How do I send an array of integers via GKSession bluetooth


I have a problem with sending an array of integers via GKSession.

This is how I did it:

To send it.

-(void)sendData {
    NSMutableArray *myArray = [[NSMutableArray alloc] init];
    [myArray addObject:[NSNumber numberWithInteger:snakeHead.position.x]];
    [myArray addObject:[NSNumber numberWithInteger:snakeHead.position.y]];
    [myArray addObject:[NSNumber numberWithInteger:direction.x]];
    [myArray addObject:[NSNumber numberWithInteger:direction.y]];
    [myArray addObject:[NSNumber numberWithInteger:bodyOffsetX]];
    [myArray addObject:[NSNumber numberWithInteger:bodyOffsetY]];
    [myArray addObject:[NSNumber numberWithInteger:amountBodies]];


    NSData* encodedArray = [NSKeyedArchiver archivedDataWithRootObject:myArray];

    [snakeSession sendData:encodedArray toPeers:snakePeers withDataMode:GKSendDataReliable
                                                            error:nil];
    [encodedArray release];
}

The sendData function is called from a scheduler.

To receive it.

-(void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session
                                                       context:(void *)context {
    NSArray *hisArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];

    snakeHead2.position = ccp([[hisArray objectAtIndex:0] integerValue], 
                          [[hisArray objectAtIndex:1] integerValue]);

    direction2 = ccp([[hisArray objectAtIndex:2] integerValue], 
                          [[hisArray objectAtIndex:3] integerValue]);

    bodyOffsetX2 = [[hisArray objectAtIndex:4] integerValue];
    bodyOffsetY2 = [[hisArray objectAtIndex:5] integerValue];
    amountBodies2 = [[hisArray objectAtIndex:6] integerValue];
}

This does not work and the game crashes.

So what am I doing wrong here?


Solution

  • heres what I would do. it even sends less bytes! (faster)

    // to send
    int snakeHead_position_x = 0;
    int snakeHead_position_y = 0;
    int direction_x = 0;
    int direction_y = 0;
    int bodyOffsetX = 0;
    int bodyOffsetY = 0;
    int amountBodies = 0;
    
    NSString *package = [NSString stringWithFormat:@"%i|%i|%i|%i|%i|%i|%i",
            snakeHead_position_x, snakeHead_position_y, direction_x,
            direction_y, bodyOffsetX, bodyOffsetY, amountBodies];
    
    NSData *data = [package dataUsingEncoding:NSASCIIStringEncoding];
    assert(data); // this is critical don't remove!
    
    //printf("sending %u bytes...\n", data.length);
    
    [snakeSession sendData:data toPeers:snakePeers withDataMode:GKSendDataReliable error:nil];
    
    
    // to retrieve
    
    NSArray *intArray = [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] componentsSeparatedByString:@"|"];
    
    int snakeHead_position_x = [intArray[0] intValue];
    int snakeHead_position_y = [intArray[1] intValue];
    int direction_x = [intArray[2] intValue];
    int direction_y = [intArray[3] intValue];
    int bodyOffsetX = [intArray[4] intValue];
    int bodyOffsetY = [intArray[5] intValue];
    int amountBodies = [intArray[6] intValue];