マルチプレイヤー ゲームに取り組んでいますが、プレイヤーの同期に問題があります。
プレーヤーが移動キー (W、A、S、D) のいずれかを押すと、クライアントは押されたボタンに関するパケットを送信し、サーバーは押されたキーに従って速度を設定し、近くにいるすべてのプレーヤーに新しい速度を送り返します。
プレーヤーがキーを放すと、クライアントはパケットを送信し、サーバーはプレーヤーの速度を 0,0 に設定し、位置と速度を近くのすべてのプレーヤーに送信します。
問題は、キーを放すと、ほとんどの場合プレーヤーが元に戻ることです。
どうすればこれを修正できますか?
私はsocket.ioを使用しています。
クライアント側:
   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()});
        }
    });
サーバ側:
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());
});