2011-10-27 17 views
5

ho codificato un'applicazione Bomberman che utilizza un peer to peer GameKit connessione. Il problema è che dopo un po 'il gioco non è più sincronizzato.Kit Gioco Peer to Peer

ho guardato il codice di esempio per GKTanks e usato il loro modello. Non vi è alcuna relazione client/server tra colleghi, quindi non ne ho usato uno nel mio gioco. Entrambi i peer mantengono un gamestate che aggiornano in base ai dati ricevuti.

Possiedo un NSTimer utilizzato per eseguire il gameloop su ciascun frame. Gli NSTimers non sono sincronizzati, quindi a volte i gamestate diventano diversi ex: i giocatori prendono un powerup all'incirca nello stesso momento e ottengono entrambi il powerup perché impiega un po 'di tempo per inviare i dati.

Gradirei qualsiasi idea di fare del lavoro app. Sto pensando di riscrivere il codice per utilizzare client-server, ma non sono sicuro che sia una buona idea ... ancora

Grazie!

MODIFICA: Ho modificato il codice in modo che venga scelto un giocatore casuale come host. Ogni volta che un giocatore piazza una bomba chiede al server dove posizionarlo. Il server restituisce la posizione dei giocatori (come visto sul server) e poi dice al giocatore dove posizionare la bomba.

Per i powerup il server controlla se un giocatore ha ricevuto un powerup e se lo ha fatto invia un pacchetto che lo informa.

Un altro problema è apparso ora. La latenza tra i dispositivi è elevata (sto usando una connessione bluetooth). Ci vogliono circa 0,2 secondi per piazzare una bomba dopo che il cliente ha toccato il pulsante per posizionarlo.

che sto inviando in modo affidabile tutti i dati. Lo sto facendo bene?

risposta

4

Beh preferbly si desidera un rapporto ospite-client in cui solo l'host può manipolare lo stato del gioco, così nel tuo caso sarebbe:

Entrambi i giocatori si precipitano al powerup. L'host lo preleva per primo.
Viene registrato e l'host riceve l'accensione.
Nel frattempo anche il giocatore n. 2 riprende l'accensione, invia l'azione all'host.
L'host informa il giocatore n. 2 che l'accensione è già scomparsa.

La cosa con la vostra situazione si sono tenuti a ottenere desynchs da perdita di pacchetti.
Con una relazione host-client che non può avvenire, l'unico problema è che l'host ha sempre un vantaggio che aumenta quando aumenta la latenza tra i dispositivi, in particolare sugli smartphone.

In un gioco come Bomberman è perfettamente plausibile inviare l'intero gamestate ogni volta che qualcosa cambia al posto dell'azione eseguita, questo per garantire che entrambi i dispositivi siano sincronizzati.

Per riassumere: entrambi gli utenti hanno il gamest ma solo l'host può manipolarli entrambi.

0

cosa si dovrebbe fare:

  • uno dei dispositivi è ospite, un altro è cliente
  • processo
  • ospite tutti gli stati del gioco e prende le decisioni, quindi invia tutto gamestate al cliente
  • il cliente ottiene il gamestate e disegna tutto sulla base di esso - non prende decisioni (chi ha scelto la bomba, ha fatto esplodere la bomba ecc.)
  • il client invia semplicemente l'input all'host (premuto a sinistra, a destra, in pausa, ecc.)

questo è tutto. se provi a prendere decisioni su entrambe le macchine, ti imbatterai in grossi problemi cercando di mantenerli sincronizzati.

Problemi correlati