Ken
Ken

Reputation: 31171

Game Center multiplayer code

As per the docs, I'm using:

- (void) match:(GKMatch*) match player:(NSString*) playerID didChangeState:(GKPlayerConnectionState) state;

to carry out the initial game negotiation. I do this in the scope of:

if (matchStarted_ == NO && [match expectedPlayerCount] == 0) { ... }

I need to decide which device is responsible for setting up the game. I do this by sorting the match.playerIDs NSArray instance and comparing the [GKLocalPlayer localPlayer].playerID NSString to the playerID NSString at index 0 of the sorted array. This player creates the game, sending out the data to all players.

However, and even with an expectedPlayerCount of 0, the playerIDs array has zero entries at this point, giving me an array overrun. Why is that? And what should I do instead to make a well-defined choice of player to generate the game?

Upvotes: 0

Views: 947

Answers (2)

Shahab Qureshi
Shahab Qureshi

Reputation: 950

here is sample code to do that thing

NSString *uid = [[UIDevice currentDevice] uniqueIdentifier];
CoinTossID = [uid hash];

now in delegate Function

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID
    {
        NSMutableArray *ReceivedArray = [[NSMutableArray alloc] init];
        ReceivedArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        int flag = [[ReceivedArray objectAtIndex:0] intValue];
        [ReceivedArray removeObjectAtIndex:0];

        int CoinValue = [ReceivedCoinTossID intValue];
        if(CoinValue > CoinTossID)
        {
           isPlayer1 = YES;
        }
        else
        {
              isPlayer1 = NO;
        }
    }

Upvotes: 1

tupakapoor
tupakapoor

Reputation: 159

For the decision code, take a look at the GKTank example provided by Apple - they take a hash of the device id, send it to the other client, and whichever has the lower number is the "host". That seems like a pretty solid way to decide.

Upvotes: 3

Related Questions