#cocoa-touch #ios #cocos2d-iphone #gamekit
#cocoa-touch #iOS #cocos2d-iphone #gamekit
Вопрос:
Как мне завершить матч / отключить игрока соперника и / или удалить стандартный интерфейс match maker (GameKit), если нажата кнопка Home на устройстве? У меня также есть кнопка «Главное меню» на экране, и если она нажата, я хотел бы завершить матч / отключить игрока противника. Я использую GameKit для поиска и запуска совпадений.
Я новичок в многопользовательской игре, поэтому буду признателен за любую помощь.
-(void) match:(GKMatch*)match player:(NSString*)playerID didChangeState:(GKPlayerConnectionState)state
{
switch (state)
{
case GKPlayerStateConnected:
[delegate onPlayerConnected:playerID];
break;
case GKPlayerStateDisconnected:
CCLOG(@"Disconnected");
[delegate onPlayerDisconnected:playerID];
break;
}
if (matchStarted == NO amp;amp; match.expectedPlayerCount == 0)
{
matchStarted = YES;
[delegate onStartMatch];
}
}
-(void) disconnectCurrentMatch
{
CCLOG(@"Quit Match");
[currentMatch disconnect];
currentMatch.delegate = nil;
[currentMatch release];
currentMatch = nil;
}
Это все, что я использую для отключения игроков. Затем, когда игрок нажимает кнопку «Главное меню», это код.
-(void)Menu: (id) sender
{
didQuit = YES;
if (isSingle == YES)
{
GameKitHelper* gkHelper = [GameKitHelper sharedGameKitHelper];
[gkHelper disconnectCurrentMatch];
gkHelper.delegate = nil;
}
[[CCDirector sharedDirector] replaceScene: [MainMenu scene]];
CCLOG(@"Return Main Menu");
}
Это заменяет сцену на главное меню, но никогда не изменяет состояние на отключенное.
Комментарии:
1. Установили ли вы точку останова в коде (isSingle == YES), чтобы убедиться, что логика выполняется?
2. Если вы имеете в виду «разрыв»; Я не могу, поскольку это не в цикле или переключении, но я добавил «CCLOG» для проверки, и да, он вызывался. Я также добавил еще одну проверку в «disconnectCurrentMatch», и когда я нажимаю кнопку главного меню в game, это вызывает ее.
3. хм .. откуда вы знаете, что он не отключен? При смене сцены оно автоматически отключается? НЕТ?
4. Нет, я имел в виду точку останова Xcode — остановку выполнения в этот момент и проверку того, что происходит. Но если вы точно знаете, что isSingle == YES, тогда все в порядке. это то, что я хотел подтвердить. Что в этом методе: [делегировать на playerdisconnected:идентификатор игрока];
5. Просто «CCLOG (@»onPlayerDisconnected: % @», идентификатор игрока);», чтобы указать, какой проигрыватель отключился. Я обнаружил, что состояние не изменится, если я не нажму кнопку главного меню, а затем вернусь, чтобы начать другое совпадение. Затем вызывается «onPlayerDisconnected» и «onPlayerConnected» вызывается еще раз. Я также использую симулятор и свое устройство для тестирования многопользовательской игры.
Ответ №1:
Джон,
При нажатии кнопки home делегат вашего приложения получит -(void)applicationDidEnterBackground:(UIApplication*)application
обратный вызов.
У вас есть примерно 5 секунд (до того, как Springboard завершит работу вашего приложения), чтобы сделать все необходимое для очистки вашего приложения (если вам не нужно больше времени, которое вы можете запросить у iOS, но не гарантировано получите).
Как вы «очищаете»? Как вы упомянули — в вашем матче участвуют 2 игрока, поэтому отключение или выход игрока из игры оказывает одинаковое влияние на игру — ее завершение (при условии, что игрок не может продолжать играть самостоятельно).
Уходящий игрок отправит -disconnect
сообщение в GameKit.
Программа, оставленная в проигрывателе, должна иметь объект, соответствующий протоколу GKMatchDelegate, и получать обратные вызовы в качестве делегата GKMatch
.
Когда противоположный игрок отключается, GKMatch вызовет делегата с:
- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state`
Итак, теперь код вашего проигрывателя, который был оставлен без внимания, также будет уведомлен. В этом методе проверьте, происходит ли отключение — и если да, следуйте своей собственной логике для того, что вы хотите, чтобы произошло, когда проигрыватель «зависает».
Комментарии:
1. Я использую Cocos2d, поэтому при нажатии кнопки home игра автоматически приостанавливается. Итак, я добавил в BOOL, чтобы проверить, было ли это в мультиплеере (isMP = ДА, когда сцена заменяется на многопользовательскую и isMP = НЕТ, когда сцена заменяется на одиночную). В applicationWillTerminate и applicationDidEnterBackground я добавил флажок «if (isMP == YES) { // отменить совпадение}», но я не могу выяснить, что вставить между этими скобками, чтобы отменить совпадение и / или удалить стандартный интерфейс match maker. Кажется, я также не могу найти это в документах API. Я знаю, что это, вероятно, всего одна строка кода.
2. Не уверен в варианте использования, но разве это не то, что вы хотите: developer.apple.com/library/ios/#documentation/GameKit /… ?
3. Я попробовал это, и это не отключает игрока и не уведомляет игрока противника о том, что они были отключены, я в тупике.
4. При отключении вы не несете ответственности за уведомление противоположного игрока — предполагается, что реализация противоположного игрока сделает это через обратный вызов делегата, который они получат после вашего отключения.
5. Джон — забыл одну важную вещь. В вашей игре могут играть только 2 человека?