Bewegung "Algorithmus" in der client-server-Multiplayer (MMO) - Spiele?

Ich habe das schreiben von einer 2D-flash-multiplayer-Spiel und einem socket-server. Mein ursprünglicher plan für die Bewegung Algorithmus zwischen client und server war die folgende:

  • Der client informiert den server über die der Spieler die Bewegung des Modus (vorwärts bewegt oder nicht bewegt) und die player  s-drehen-Modus (nicht drehen, Links abbiegen oder rechts), wenn diese sich ändern.
    • Die server-loops alle Spieler alle paar Millisekunden und berechnet den Winkel gedreht und die Distanz verschoben, basierend auf der Differenz in der Zeit. Die gleiche Berechnung erfolgt durch den AUFTRAGGEBER.

Meine aktuelle Berechnung für den Kunden (gleich Mathematik ist in server) ==>

Drehen

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;
        }

Bewegung

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)];
        }

Scheint dies gut zu funktionieren. Um Verzögerung zu berücksichtigen, die der server korrigiert das Kunden-info, jeden jetzt und dann, durch das senden dieser Daten.

Mit diesem system eine sehr geringe Bandbreite verwendet wird, um die handle-Bewegung. Allerdings sind die Unterschiede zwischen meinem server und den client-Koordinaten und Winkel sind zu groß. Sollte ich vielleicht verlängern mein "Algorithmus", um auch zu berücksichtigen, die Wartezeit hat ein Benutzer? Oder gibt es bessere Wege im Umgang mit Bewegung im client<>server für multiplayer-Spiele mit guter performance?

InformationsquelleAutor Tom | 2009-06-30
Schreibe einen Kommentar