2016-05-18 18 views
0

Ich möchte von Grund auf eine Art kleines (extrem kleines und einfaches) MMORPG-Spiel mit Klickbewegungen innerhalb eines gegebenen Rasters aufbauen (so etwas wie ein Online-Pokemon-Spiel). Wenn ich auf eine Zelle klicke, bewegt sich der Spieler, um den spitzen Bereich zu erreichen (mit einem Wegsuch-Algorithmus wie A *). Aber ich habe keine Ahnung, wie man das Netzwerkprotokoll des Bewegungssystems erstellt. Und das Thema zu googeln scheint mir nicht viel zu helfen. Ich muss eine Wahl treffen: Entweder ich sende eine Nachricht an den Server jedes Mal, wenn ich von einer Zelle zur anderen gehe (was überhaupt nicht effizient ist, denn wenn wir uns in einem 100ms Latenznetzwerk befinden, kann ich nur 10 Bewegungen pro Sekunde erkennen und wenn ich den Server frage, die Bewegung zu bestätigen, kann es nur 5 moves/sec machen) - entweder sende ich eine Nachricht jedes Mal, wenn der Spieler seine Richtung ändern will (er klickt auf eine andere Zelle). Der Client sendet periodisch seine Position an den Server und überprüft, ob er mit dem Ziel übereinstimmt.MMORPG Moving-Protokoll-Mechanismus

Die zweite Lösung sieht viel besser aus als die erste und ich denke, dass ein echtes Spielsystem diese Strategie umsetzen muss. Liege ich falsch?

Auch, wie können wir Systeme basierend auf dieser Lösung bauen, die nicht einen modifizierten (gehackten) Client in der Lage sein, falsche Positionen zu senden und Teleport wohin sie wollen? Realisieren reale Systeme etwas wie ein "inkohärentes gesendetes Positionssystem", das versuchen wird, diese Probleme zu erkennen und zu beheben?

Oder ist etwas einfacher zu implementieren? Vielen Dank

+0

Wird das Spiel rundenbasiert sein? Wenn ja, würde ich alle Bewegungen sammeln, bevor die Runde vorbei ist, dann würde ich sie als Paket zu den Servern schicken. und geh von dort. Nun, wenn es in Echtzeit ist, dann möchten Sie ja jede Bewegung an den Server senden. – ScarletMerlin

+0

Gute Frage :) Nein, es ist Echtzeit, aber ich muss nicht jede Bewegung an den Server senden, ich brauche nur eine Art Synchronisation zwischen dem Client und dem Server (die lokale und die Online-Positionen müssen immer ganz in der Nähe sein) –

Antwort

1

Dank ScarletMerlins Antworten denke ich, dass es eine einfache Lösung für mein Problem gibt.

Wenn der Spieler von einer Position (z. B. 0,0) zu einer anderen (z. B. 10,10) wechseln möchte, sendet er eine Nachricht "MOVE 10 10" an den Server.

Dann wird nur der Server den Pfadfindungsalgorithmus anwenden und nach jedem Verschieben die Position an den Client senden. (zum Beispiel durch die Nachricht CURRENTLY_ON XY). Dann aktualisiert der Client die Position des Spielers.

Es ist eine Art automatische Synchronisation vom Server zum Client. Es löst auch das Problem der ersten Lösung (eine Bewegung und eine ACK pro Bewegung) dank der Pipelines. Zum Beispiel, wenn das Netzwerk eine Verzögerung von 1000ms hat und eine Bewegung auf 50ms eingestellt ist, erhalten wir nur Nachrichten zu den Zeitpunkten 1000, 1050, 1100, 1150, ... Wir werden also die Verzögerung spüren, wenn der Spieler seine Richtung ändert . Der Benutzer wird auch eine gewisse Verzögerung empfinden, wenn er von einer Richtung in eine andere wechselt, aber wenn wir annehmen, dass die Verzögerung ziemlich niedrig und symmetrisch ist (es scheint keine zu starke Annahme zu sein), wird sie nicht so stark wahrgenommen werden (Da die Änderungsrichtung oft vor dem Senden der Nachricht CURRENTLY_ON eintrifft, kann der Server seine aktuelle Aktion unterbrechen (geradeaus), um mit der neuen fertig zu werden.

1

In einem Echtzeit-Spiel würde ich eine Panthing-Mechaniker erstellen. Ich würde eine Formel verwenden wie: Geschwindigkeit * Zeit = Entfernung.

Wenn Sie jetzt die gleiche Logik im Client und im Server ausführen, müssen Sie nur die Bewegungslogik am Anfang senden und der Server kann mit einer Fertigmeldung antworten, wenn die Entfernung zurückgelegt wird. (Vergleichen Sie am Ende, um Betrug zu vermeiden. Der Server gewinnt immer)

Jetzt, wenn der Kunde in der Bewegung storniert, um woanders hinzugehen, senden Sie eine Aufhebung des Panthing und die Zeit, die Sie gereist sind. Dasselbe gilt für den Wechsel des Panthing (in diesem Fall senden Sie einen neuen Pfad, der auf eine neue Zeit und einen neuen Ort starrt).

+0

Ok, du würdest so etwas wie den zweiten Ansatz verwenden. Wie würden Sie mit Sicherheitsproblemen umgehen? Zum Beispiel, du annullierst eine Bewegung. Ich denke, dass Sie die X, Y-Position, auf der Sie vor dem Abbrechen waren, senden müssen (denn wenn Synchronisationsprobleme nicht zu Inkonsistenzen zwischen Client und Server führen würden). Und wie würdest du verhindern, falsche X, Y-Positionen zu senden (als ob ein Hacker versucht, seine eigenen Nachrichten zu senden, um den Spieler zu teleportieren)? Danke :) –

+0

Der Server läuft auch die Pfadlogik (der Server weiß, wo Sie sich gerade befinden). Wenn Sie also zu x, y von 0,0 wechseln möchten. Der Server beginnt, die Zeit zu zählen, seit du ihm gesagt hast, dass du dich bewegst. Wenn Sie abbrechen, sagen Sie dem Server, dass ich die Bewegung um x Zeit zu stoppen, so muss ich an der y-Position sein (daher ist alles, was Sie brauchen, ist die Zeit abbrechen.) – ScarletMerlin

+0

Ja, aber ich denke, dass die Synchronisation zwischen einem Client und einem Server ist ein viel komplexeres Problem (welche Zeit können wir verwenden? Client-Zeit? Server-Zeit? Wie können wir es in einigen Millisekunden teilen). Wenn beispielsweise die Latenz von 0 ms bis 1000 ms variieren kann, kann die Verwendung dieses Systems sehr unvorhersehbare Ergebnisse haben. Liege ich falsch? –