Multiplayer-Spiel-Bewegung-Synchronisierung
Arbeite ich an einem multiplayer-Spiel, und ich bin mit problem bei der Synchronisierung Spieler.
Wenn ein Spieler drückt eine der Tasten bewegen (W,A,S,D) dann sendet der client ein Paket über die-Taste gedrückt, wird der server legt die Geschwindigkeit entsprechend der gedrückten Taste und sendet an alle Spieler in der Nähe die neue Geschwindigkeit.
Wenn der Spieler die Taste loslassen dann die clients sendet ein Paket, server legt der Spieler die velocity auf 0,0 und sendet die position und die Geschwindigkeit für alle Spieler in der Nähe.
Also das problem ist, wenn ich die Taste loslassen, dann die meisten der Zeit, die der Spieler springt zurück.
Wie könnte ich dieses Problem beheben?
bin ich mit Buchse.io.
Client-Seite:
socket.on('positionEntity', function (data) {
console.log((data.x - entities[data.id].x)+" "+(data.y - entities[data.id].y));
entities[data.id].setPosition(data);
});
$(document).keyup(function(e) {
if (e.keyCode == 87) {
keys.W = false;
socket.emit("stopMove", {dir: 0, time: Date.now()});
}
if (e.keyCode == 65) {
keys.A = false;
socket.emit("stopMove", {dir: 1, time: Date.now()});
}
if (e.keyCode == 83) {
keys.S = false;
socket.emit("stopMove", {dir: 2, time: Date.now()});
}
if (e.keyCode == 68) {
keys.D = false;
socket.emit("stopMove", {dir: 3, time: Date.now()});
}
});
$(document).keydown(function(e) {
if (e.keyCode == 87 && !keys.W) {
keys.W = true;
socket.emit("startMove", {dir: 0, time: Date.now()});
}
if (e.keyCode == 65 && !keys.A) {
keys.A = true;
socket.emit("startMove", {dir: 1, time: Date.now()});
}
if (e.keyCode == 83 && !keys.S) {
keys.S = true;
socket.emit("startMove", {dir: 2, time: Date.now()});
}
if (e.keyCode == 68 && !keys.D) {
keys.D = true;
socket.emit("startMove", {dir: 3, time: Date.now()});
}
});
Server-Seite:
socket.on('startMove', function(data) {
if (data.dir == 0) socket.player.setMotionY(-5);
if (data.dir == 1) socket.player.setMotionX(-5);
if (data.dir == 2) socket.player.setMotionY(5);
if (data.dir == 3) socket.player.setMotionX(5);
io.sockets.emit("positionEntity", socket.player.serializePosition());
});
socket.on('stopMove', function(dir) {
socket.player.setMotionX(0);
socket.player.setMotionY(0);
io.sockets.emit("positionEntity", socket.player.serializePosition());
});
- "Wie könnte ich dieses Problem beheben?" ... gut, wie wir Ihnen helfen ohne code ?
- Ohh sorry stimmt, werde es Bearbeiten.
- Als Anregung verwenden
e.which
innen jQuery event-Handler - jQuery normalisieren browser Inkonsistenzen beim abrufen der Schlüssel-code ine.which
- Nein, die Spieler springen nicht zurück, weil die Latenz. client bewegen und senden Paket an den server, nach 100ms -, server-recv dieses Paket dann bewegen Sie den player(auf server Seite). So kann der Spieler auf client-ahead-100ms als server. wenn Benutzer aufhören, einfach aufhören. nach 100ms server beginnen stoppen. Sie können zwei pc ' run mmorpg-Spiel, beobachten Sie die Spieler bewegen,
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine sehr komplexe Aufgabe, für die Sie arbeiten, und etwas, das ich getan habe, als Teil einer pet-Projekt 😉
Sie arbeiten auf einem client-server-Architektur-Spiel so ist der server, der Autorität auf dem Spiel Logik und Entscheidungen. Sie Art und Weise Sie derzeit Umgang mit rendering machen, plötzliche Veränderungen in der Geschwindigkeit und Richtung scheinbare wegen der Latenz (wie Sie sicher bemerkt haben!)
Der trick ist, die Puffer Bewegung Informationen von remote-Spieler, so dass Sie immer die render-player mit einer leichten Verzögerung. Ich hielt Dinge, die primitiv in meinem Projekt und nur die Positionsdaten, nicht die Beschleunigung oder die Geschwindigkeit. Beispiel, wenn Spieler A bewegt sich auf seine Maschine, einen Befehl nicht sofort gesendet Bestätigung erhalten, er bewegt und auf den nächsten tick an mein Netzwerk senden loop (10 ticks pro Sekunde) seine position ausgelöst wird, um die server, die updates alle clients in der Umgebung mit dieser neuen position. Diese Kunden haben einen Puffer für jede "remote" - Spieler, die speichert jede position für eine Zeit (100 MS) vor dem Rendern das update. Auf diese Weise wird der client gerendert wird mit einer leichten Verzögerung, aber ich kann interpolieren (glätten Sie den übergang der sprite/Modell) zwischen den einzelnen positions-Koordinierung zu erreichen, fließenden Bewegung mit der illusion von Geschwindigkeit und Beschleunigung.
Einem BASIC-interpolation " - Funktion für client-code. Dieses system ist nur in der Warteschlange zwei updates für jedes remote-Spieler am meisten, wobei der index 0 in der update-array war der ältere von beiden. Also index 0 können die remote-player position 0ms und index 1 ist die entfernte position bei 100ms.
In diesem code war ich die updates wurden ca 100ms auseinander, also zum Zeitpunkt 0-position s1 und Zeit, 100ms s2 ist die position. Wenn also 50ms sind vergangen, seit wir erhalten s2 dann die Person ist 50% zwischen den beiden Positionen. Das war gut für mein Bedürfnis, aber funktioniert möglicherweise nicht, die in anderen Arten von spielen oder müssen möglicherweise Feinabstimmung.
Diese Ressourcen sind ein hervorragender start, um zu erklären, vernetzte Spiele und den Umgang mit Latenz -, Sie werden erstaunt über den Unterschied, der Umsetzung interpolation und extrapolation auf Ihr Spiel Glätte in remote-clients.
http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about-game-networking/
https://developer.valvesoftware.com/wiki/Latency_Compensating_Methods_in_Client/Server_In-game_Protocol_Design_and_Optimization <- RICHTIG GUT!
https://developer.valvesoftware.com/wiki/Lag_compensation
Glück 🙂