Ho scritto un gioco multiplayer 2D flash e un server socket. Il mio piano originale per l'algoritmo di movimento tra il client e il server è stato il seguente:"algoritmo" di movimento nei giochi Multiplayer (MMO) client-server?
- Il client comunica al server sulla modalità di movimento del giocatore (andare avanti o non si muove) e la modalità di rotazione del giocatore (non girando, girando a sinistra o girando a destra) ogni volta che cambiano.
- Il server esegue il ciclo di tutti i lettori ogni pochi millisecondi e calcola l'angolo ruotato e la distanza spostata, in base alla differenza di tempo. Lo stesso calcolo viene eseguito dal cliente.
Il mio attuale di calcolo per il cliente (stessa matematica è usata in server) ==>
Passando
var newTimeStamp:uint = UtilLib.getTimeStamp(); //set current timeStamp
var rot:uint = Math.round((newTimeStamp - turningTimeStamp)/1000 * 90); //speed = x degrees turning every 1 second
turningTimeStamp = newTimeStamp; //update timeStamp
if (turningMode == 1) //left
{
movementAngle = fixAngle(movementAngle - rot);
}
else if (turningMode == 2) //right
{
movementAngle = fixAngle(movementAngle + rot);
}
private function fixAngle(angle:int):uint //fixes an angle in degrees (365 -> 5, -5 -> 355, etc.)
{
if (angle > 360)
{
angle -= (Math.round(angle/360) * 360);
}
else if (angle < 0)
{
angle += (Math.round(Math.abs(angle)/360) + 1) * 360;
}
return angle;
}
Movimento
var newTimeStamp:uint = UtilLib.getTimeStamp(); //set current timeStamp
var distance:uint = Math.round((newTimeStamp - movementTimeStamp)/1000 * 300); //speed = x pixels forward every 1 second
movementTimeStamp = newTimeStamp; //update old timeStamp
var diagonalChange:Array = getDiagonalChange(movementAngle, distance); //with the current angle, howmuch is dX and dY?
x += diagonalChange[0];
y += diagonalChange[1];
private function getDiagonalChange(angle:uint, distance:uint):Array
{
var rAngle:Number = angle * Math.PI/180;
return [Math.round(Math.sin(rAngle) * distance), Math.round((Math.cos(rAngle) * distance) * -1)];
}
Questo sembra funzionare alla grande. Per tenere conto del ritardo, il server corregge le informazioni del cliente ogni tanto inviando questi dati.
Con questo sistema viene utilizzata una larghezza di banda molto ridotta per gestire il movimento. Tuttavia, le differenze tra il mio server e le coordinate e gli angoli del client sono troppo grandi. Dovrei forse estendere il mio "algoritmo", anche per tenere conto della latenza di un utente? O ci sono modi migliori per gestire i movimenti nel client con giochi multiplayer per server <> con grandi prestazioni?
Il server non avrebbe dovuto continuare a ricevere e inviare nuovamente tonnellate di messaggi se tutti i client dovevano informare tutti gli altri client della loro posizione corrente? – Tom
+1 Stavo per suggerire la stessa cosa. Questo è ciò che fanno molti videogiochi multiplayer popolari. Il server si assicura solo che tutti siano sincronizzati periodicamente. (Credo che i giochi di Quake lo facciano.) –
Bene, la mia prima domanda si applica ancora. I client non dovrebbero inviare migliaia di messaggi tutto il tempo per mantenere aggiornato il server ad ogni passo? Seguito dal server che invia questi dati uno di nuovo a tutti i giocatori vicini. – Tom