2011-01-18 18 views
5

Sto sviluppando un gioco di ruolo multiplayer, (No, non è un mmorpg;.)MultiPlayer Smooth movimento

La mia messa a punto corrente è come questo.

Il client comunica al server "Voglio andare avanti"/"Voglio tornare indietro", il server aggiorna la tua entità e informa tutti i client nell'area in cui è avvenuta la modifica. Il server sta anche aggiornando ogni entità ogni 20ms e inviando aggiornamenti ogni 100ms ai client, questi aggiornamenti contengono posizione, velocità, rotazione ecc.

Fin qui tutto bene, tuttavia non ho nulla in serbo per livellare il movimento tra i pacchetti dal lato del cliente, e devo dire, non riesco a farlo funzionare. Ho letto su predizione, interpolazione, deadreacking ma è tutto un gran casino per me.

Quindi ora sto facendo qualcosa come "Posizione = Pacchetto.Posizione", che causa un movimento molto balbettante.

Quindi, quello che voglio aiuto è, come faccio a ottenere un movimento più regolare? Ho visto XNA Prediction Sample, ma non sono riuscito a farlo bene.

Grazie // F

+0

È necessario rendere solo i movimenti del giocatore più agevoli o anche altri oggetti? Il cliente conosce la velocità attuale del giocatore? – ssmir

+0

Bene, attualmente ho solo un giocatore, quindi questa è la mia preoccupazione principale. Il client conosce la velocità, è incluso nel pacchetto di stato dal server. In realtà ho una bella risposta su IRC, ci proverò domani e se ne condividerò il successo. –

risposta

3

Io suggerirei l'idea da another question (vedi la risposta accettata)

Qui il cliente calcola la propria posizione in sé, come se il suo non è un gioco di rete. Il cliente invia regolarmente la sua posizione corrente al server. E se il cliente imbroglia o non può continuare a muoversi nella direzione scelta, il server invia semplicemente al cliente la sua posizione corretta.

Lo stesso algoritmo è stato utilizzato in Ultima Online (almeno quando giocavo 10 anni fa)

+0

È divertente il modo in cui lei parla di Ultima Online, è uno dei miei giochi preferiti. :) Se trovo problemi con la mia attuale implementazione, proverò questo. Tuttavia, questo risultato non fa una grande differenza tra ciò che vede il giocatore A e il giocatore B? –

+0

@Fredrik Sì, anche uno dei miei preferiti =) In realtà la differenza dipenderà dai ping dei giocatori e può essere stimata. Ma non penso che la differenza giochi alcun ruolo qui perché, ad es. quando si attacca qualcuno in UO il client invia l'ID dell'oggetto oggetto di attacco. Quindi alcune differenze nelle posizioni possono essere visibili solo se si mettono due monitor vicini e confrontati. I problemi dovrebbero iniziare a comparire quando si esegue il gioco su Internet anziché su LAN. Soprattutto se usi TCP perché ogni perdita di pacchetti si traduce in un enorme ritardo misurato in secondi (almeno). – ssmir

0

ho risolto eseguendo un'entità fantasma a fianco con il mio principale.
Il ghost verrà aggiornato ogni frame, ma ogni volta che entra un pacchetto, i suoi valori sono impostati sui valori del pacchetto.

Poi ho gradualmente modificare l'entità reale in cui si trova il fantasma.

+0

quindi hai ancora un ritardo tra il momento in cui il giocatore inizia il movimento e il momento in cui il fantasma riceve la nuova posizione? – ssmir

+0

Sì, tuttavia questo non è notevole. –