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.
- 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ć?
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.
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? –
"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