T
Teppich
Gast
Ich arbeite zurzeit an einem 2D MMORPG in welchem man bisher nur herumlaufen kann.
Der Server sendet im Moment jedem Spieler auf der selben Map die Positionen der anderen Spieler, die in der Nähe sind.
Der Client sendet Pakete mit einem einzelnen Byte um seine Bewegungsrichtung dem Server mitzuteilen (8 Richtungen).
Nun bin ich gerade dabei mir eine Lösung zu überlegen um dem Spieler ein flüssiges Spielerlebnis zu ermöglichen, ohne dass es möglich ist mit Hacks seine Position zu verändern.
Im moment habe ich dies umgesetzt:
1. Interpolation zur eigenen Position mithilfe der Serverpositionen.
2. Simulation der Bewegung durch Client
Zweiteres klingt besser, jedoch scheiterts momentan an der Umsetzung, da die Ruckler zu oft auftreten und ich nicht genau weiß, wie ich die Position während der Bewegung richtig anpasse.
Ich habe versucht beim Client eine Historie der vorherigen Positionen + Zeit anzulegen um die Position vom Server mit der am naheliegendsten Position in der Historie zu vergleichen.
Das sieht in etwa so aus:
Positionshistorie:
Serverposition:
ServerPosition[x, y, currentTime - ping/2]
Nun wird verglichen welche Position in der Historie der Serverposition am nähsten kommt und eine Differenz berechnet. Meist liegt diese bei etwa 3-4 ms. Die Toleranz berechne ich aus der Differenz der Zeit und wenn die Position nicht in etwa übereinstimmt muss angepasst werden. Während der Bewegung ist es jedoch nicht einfach die richtige Position zu ermitteln. Anscheinend klappt das ganze bei mir noch nicht richtig und es kommt zu oft zu Rucklern.
Da die Zeiten nicht genau übereinstimmen und immer eine Differenz von etwa 0-15 ms (Ich speichere Positionen etwa alle 15 ms) vorhanden ist, muss ich irgendwie die eine Differenz der falschen und richtigen Position ermitteln um die momentanige Position zu verschieben damit die Client- und Serverposition wieder im Einklang ist.
Daran scheiterts im Moment. Eventuell gehe ich das ganze auch total falsch an. Ich weiß nicht.
Für Hilfe wäre ich dankbar.
Oliver
Der Server sendet im Moment jedem Spieler auf der selben Map die Positionen der anderen Spieler, die in der Nähe sind.
Der Client sendet Pakete mit einem einzelnen Byte um seine Bewegungsrichtung dem Server mitzuteilen (8 Richtungen).
Nun bin ich gerade dabei mir eine Lösung zu überlegen um dem Spieler ein flüssiges Spielerlebnis zu ermöglichen, ohne dass es möglich ist mit Hacks seine Position zu verändern.
Im moment habe ich dies umgesetzt:
1. Interpolation zur eigenen Position mithilfe der Serverpositionen.
- Position ist immer exakt
- Position ist um RTT / 2 verzögert
- Hoher Ping verhindert "flüssiges" Spielgefühl
2. Simulation der Bewegung durch Client
- Flüssiges Spielgefühl unabhängig vom Ping
- Position muss gelegentlich angepasst werden was zu einem kurzen Ruckler führt
Zweiteres klingt besser, jedoch scheiterts momentan an der Umsetzung, da die Ruckler zu oft auftreten und ich nicht genau weiß, wie ich die Position während der Bewegung richtig anpasse.
Ich habe versucht beim Client eine Historie der vorherigen Positionen + Zeit anzulegen um die Position vom Server mit der am naheliegendsten Position in der Historie zu vergleichen.
Das sieht in etwa so aus:
Positionshistorie:
- Position[x1, y1, time1]
- Position[x2, y3, time2]
- Position[x3, y3, time3]
- ...
Serverposition:
ServerPosition[x, y, currentTime - ping/2]
Nun wird verglichen welche Position in der Historie der Serverposition am nähsten kommt und eine Differenz berechnet. Meist liegt diese bei etwa 3-4 ms. Die Toleranz berechne ich aus der Differenz der Zeit und wenn die Position nicht in etwa übereinstimmt muss angepasst werden. Während der Bewegung ist es jedoch nicht einfach die richtige Position zu ermitteln. Anscheinend klappt das ganze bei mir noch nicht richtig und es kommt zu oft zu Rucklern.
Da die Zeiten nicht genau übereinstimmen und immer eine Differenz von etwa 0-15 ms (Ich speichere Positionen etwa alle 15 ms) vorhanden ist, muss ich irgendwie die eine Differenz der falschen und richtigen Position ermitteln um die momentanige Position zu verschieben damit die Client- und Serverposition wieder im Einklang ist.
Daran scheiterts im Moment. Eventuell gehe ich das ganze auch total falsch an. Ich weiß nicht.
Für Hilfe wäre ich dankbar.
Oliver