エンジニアリングにはほど遠い

iPhoneアプリとかサイトとかをつくっていくブログです。

GameCenter対戦で、アプリのバージョンが違うプレーヤーがマッチしないようにした

GameCenterでの対戦ゲームを作ってるんですが、自分の仕様だとバージョンが違うプレーヤー間に有利不利が付いてしまう可能性があるので、同じバージョン同士の人しか当たらないようにしたいと考えました。

そこで、GKMatchRequestのplayerGroupを使ってみました。これはNSIntegerなんですが、0以外の値を設定すると、同じ32bit値を設定したプレーヤーとのみマッチングされるようになるそうです。

AppDelegate.mのapplicationDidFinishLaunching:に

NSString* version =  [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

float verFlo = [version floatValue];
int verGroup = verFlo * 100;
NSNumber * verGroupNum = [NSNumber numberWithInt:verGroup];

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setValue:verGroupNum forKey:@"VerGroup"];

こういう感じでNSUserDefaultsのVerGroupというkeyにバージョンを整数化したものを入れておいて、あとはマッチのリクエストを作る際に、

GKMatchRequest* request = [[[GKMatchRequest alloc] init] autorelease];
request.minPlayers = 2;
request.maxPlayers = 2;
        
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSNumber *verGroupNum = [userDefaults objectForKey:@"VerGroup"];
request.playerGroup = [verGroupNum intValue];

このような形でplayerGroupに指定してやれば、この値が同じプレーヤーとしかマッチしませんでした。
playerGroupをバージョン情報に割くのはもったいない、と思ったら、上3ケタはバージョンに使う、みたいな感じでケタで分けるといいかもしれません。