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 in e.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,
Schreibe einen Kommentar