2011-10-27 11 views
5

Zakodowałem aplikację Bomberman, która używa połączenia typu peer-to-peer. Problem polega na tym, że po pewnym czasie gra nie jest już zsynchronizowana.Zestaw do gier Peer to Peer

Przyjrzałem się przykładowemu kodowi dla GKTanks i użyłem ich modelu. Nie ma relacji klient/serwer między równorzędnymi, więc nie użyłem jej w mojej grze. Obaj rówieśnicy utrzymują gamestat, który aktualizują na podstawie otrzymanych danych.

Mam NSTimer, który jest używany do uruchamiania gameloop w każdej klatce. NSTimery nie są zsynchronizowane, więc czasami gamestaty stają się różne: gracze zbierają powerup w przybliżeniu w tym samym czasie i obaj dostają powerup, ponieważ przesłanie danych zajmuje trochę czasu.

Byłbym wdzięczny za każdy pomysł, aby aplikacja działała. Zastanawiam się nad przepisaniem kodu na serwer klienta, ale nie jestem pewien, czy to dobry pomysł ... jeszcze

Dziękuję!

EDYCJA: Zmieniłem kod tak, aby losowy gracz został wybrany jako gospodarz. Za każdym razem, gdy gracz umieszcza bombę, pyta serwer, gdzie ją umieścić. Serwer zwraca pozycję gracza (jak widać na serwerze), a następnie informuje gracza, gdzie umieścić bombę.

Dla ulepszeń serwer sprawdza, czy gracz podniósł powerup, a jeśli to zrobił, wysyła pakiet informujący go.

Kolejny problem pojawił się teraz. Opóźnienie między urządzeniami jest wysokie (korzystam z połączenia Bluetooth). Potrzeba około 0,2 sekundy, aby umieścić bombę po tym, jak klient stuknął przycisk, aby ją umieścić.

Wysyłam wszystkie dane niezawodnie. Czy robię to dobrze?

Odpowiedz

4

Dobrze preferbly chcesz relacji hosta klienta, gdzie tylko gospodarz może manipulować stanu gry, więc w Twoim przypadku będzie to:

Obaj gracze biec do rozruchu. Gospodarz podnosi to jako pierwsze.
Zostaje zarejestrowany, a host otrzymuje power-up.
W międzyczasie gracz # 2 również podnosi power-up, wysyła akcję do hosta.
Gospodarz informuje gracza nr 2, że power-up już zniknął.

Rzeczy związane z twoją sytuacją są zobowiązane do uzyskania desynchów z utraty pakietów.
Z relacją host-klient, która nie może się zdarzyć, jedynym problemem jest to, że host ma przewagę, która staje się większa, gdy opóźnienie wzrasta między urządzeniami, zwłaszcza na smartfonach.

W grze podobnej do bombermana można wysłać cały gamestat za każdym razem, gdy coś się zmieni, zamiast wykonanej akcji, aby oba urządzenia były zsynchronizowane.

Podsumowując: obaj użytkownicy mają swój gamestat, ale tylko gospodarz może nimi manipulować.

0

co należy zrobić:

  • jedno z urządzeń jest gospodarzem, drugi jest klientem
  • procesowe
  • zapamiętać wszystkie stany gry i podejmuje decyzje, a następnie wysyła cały gamestate do klienta
  • klient otrzymuje gamestate i po prostu rysuje wszystko na jego podstawie - nie podejmuje żadnych decyzji (kto wybrał bombę, czy eksplodował bomba itp.)
  • klient po prostu wysyła dane wejściowe do hosta (naciśnięcie w lewo, prawo, pauza itp.)

to wszystko. jeśli spróbujesz podjąć decyzję na obu maszynach, napotkasz duże problemy, starając się je zsynchronizować.

Powiązane problemy