2010-10-07 11 views
13

Po prostu nie mogę zrozumieć, jak to działa. Co staram się zrobić, to pozwolić dwóm graczom na grę, jeśli trzeci gracz dołącza do niej, może natychmiast dołączyć do gry, jeśli czwarty i ostatni gracz dołączy do niej, może również natychmiast dołączyć do gry. Mogą również opuścić grę w dowolnym momencie z dowolnego powodu, jeśli tak się stanie, powinno być wolne miejsce dla innej osoby lub dla tej samej osoby, która chce się ponownie połączyć. To jest pomysł.Game Center Wyszukiwanie meczu Programowo

Teraz otrzymałem następujące informacje. Uwierzytelniam lokalnego gracza z oczywistych powodów. Potem szukać meczu tak:

if (matchRequest) [matchRequest release]; 
matchRequest   = [[GKMatchRequest alloc] init]; 
matchRequest.minPlayers = 2; 
matchRequest.maxPlayers = 4; 

[[GKMatchmaker sharedMatchmaker] findMatchForRequest:matchRequest withCompletionHandler:^(GKMatch *match, NSError *error) { 
    if (error) { 
     // An error occured 
    } else { 
     if (matchCurrent) [matchCurrent release]; 
     matchCurrent   = [match retain]; 
     matchCurrent.delegate = self; 
    } 
}]; 

Gdybym wykonać tę część na trzech różnych urządzeń, dwie z nich znajdzie się nawzajem, a trzecia wciąż szuka. Tak więc doszedłem do wniosku, że po znalezieniu meczu na żądanie znaleziono minimalną liczbę graczy, która zostanie wykonana raz. Potrzebowałem więc metody wykorzystującej MatchCurrent, którą zachowałem, aby dodać więcej graczy. Na szczęście ta metoda istniała, ale jak by to działało? Kiedy zadzwonisz w tym przypadku? Postanowiłem umieścić go pod przyciskiem, dzięki czemu mogłem ręcznie go uruchomić po znalezieniu meczu.

To, co odkryłem, to że kiedy nacisnąłem go na pierwszym urządzeniu, ostatecznie trzecie urządzenie mogło znaleźć dopasowanie do pierwszego i drugiego urządzenia. W rzeczywistości drugie i trzecie urządzenie zawierało ID gracza dla każdego urządzenia. Co jest dobre. Ale są dwa problemy.

  1. Które urządzenie powinno wywoływać metodę addPlayersToMatch? I jak możesz ograniczyć to do jednego urządzenia wykonującego tę metodę? Plus kiedy należy to nazwać?
  2. Dlaczego na urządzeniu wywołującym tę metodę nie są aktualizowane ID gracza?

    [[GKMatchmaker sharedMatchmaker] addPlayersToMatch:matchCurrent matchRequest:matchRequest completionHandler:^(NSError *error) { 
        //matchCurrent.playerIDs is not updated?! 
    }]; 
    

    W rzeczywistości są one aktualizowane. Kiedy widzę playerID na drugim i trzecim urządzeniu, ręcznie aktualizuję matchCurrent.playerID na urządzeniu i nagle rozpoznaję odtwarzacz. Jednak nawet "didChangeState" dla gracza nie jest wywoływane, gdy nowy gracz zostanie odkryty na urządzeniu.

+0

Czy ta opiera się na modelu klient-serwer lub modelu p2p? Co jest używane do inicjowania połączenia, tcp, udp, http? Gdzie są dane dla aktualnie podłączonych graczy? –

+3

"Staram się pozwolić dwóm graczom na grę, jeśli dołączy do nich trzeci gracz" - Czy możesz dodać średniki i przecinki do drugiego i trzeciego zdania? Tak jak to jest w zdaniach następnych, trudno jest stwierdzić, czy każda klauzula if modyfikuje poprzedzającą lub następującą niezależną klauzulę. – LarsH

Odpowiedz

0

Proponuję okresowe (może raz na sekundę lub dwie) ankietowanie o statusie innych graczy, aby można było wykryć, czy ktoś dołączył lub został z dowolnego powodu. O ile architektura iphone, której używasz, już zawiera funkcję, która obsługuje to zdarzenie.

Wygląda na to, że możesz chcieć znaleźć więcej dokumentacji i/lub przykładowy kod dla struktury dla wielu graczy, z której korzystasz.

1

Które urządzenie powinno rzeczywiście wywoływać metodę addPlayersToMatch ? A w jaki sposób można ograniczyć to do jednego urządzenia, wykonując tę ​​metodę?

Możesz rozwiązać ten problem, używając urządzeń "wyciągnij słomki". Każde urządzenie generuje liczbę losową, a następnie przesyła ją do innych. Urządzenie z największą liczbą jest liderem i to on musi wywołać addPlayersToMatch. Jeśli dwa urządzenia wybierają tę samą liczbę, wyrzuć numery i zacznij od nowa.

2

Twoje używanie klasy GKMatchmaker w Centrum gier Apple iOS. Zakładam, że korzystasz z połączenia peer-to-peer, a nie hostowanego.

Klasa GKMatch udostępnia tablicę playerIDs.

@property(nonatomic, readonly) NSArray *playerIDs 

To jest uporządkowana lista, więc może być w stanie z niego korzystać, aby wybrać pierwszą rozmowę gracz addPlayersToMatch.

Poniżej przedstawiono powiązaną dokumentację.

http://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKMatchmaker_Ref/Reference/Reference.html

http://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKMatch_Ref/Reference/Reference.html

http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/GameKit_Guide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008304

Powiązane problemy