Как я могу отправить реальные данные в Node.js? - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть игра на стороне сервера, обновите логику с 60 FPS и отправьте данные с 10 FPS

var PLAYER_LIST = {};

class Player {
    constructor(socket) {
        this.id = Math.random() * 9999;
        this.pressKeyAttack = 0;
        this.socket = socket;
        PLAYER_LIST[this.id] = this;
    }
    setupSocket() {
        this.socket.on("keypress", (data) => {
            if (data.key == 1) this.pressKeyAttack = data.value;
        });
    }
    send() {
        //Simple data
        //Send to this player all data from PLAYER_LIST
        var data = {};
        for (var id in PLAYER_LIST) {
            data[id] = PLAYER_LIST[id].pressKeyAttack;
        }
        this.socket.emit("data", data);
    }
    update() {
        if (this.pressKeyAttack == 1) {
            //do something
        }
    }
}

io.sockets.on("connection", (socket) => {
    new Player(socket);
});

setInterval(() => {
    //Logic update
    for (var id in PLAYER_LIST) {
        PLAYER_LIST[id].update();
    }
}, 1000 / 60);

setInterval(() => {
    //Send data
    for (var id in PLAYER_LIST) {
        PLAYER_LIST[id].send();
    }
}, 1000 / 10);

Пример На стороне клиента, когда любой игрок нажимает [Space], тогда все другие игроки будут видеть анимацию изэтот игрок.

var PLAYER_LIST = {}; //all player

for (var id in PLAYER_LIST) {
    if (PLAYER_LIST[id].pressKeyAttack == 1) {
        //run animation
    }
}

socket.on("data", (data) => {
    for (var id in data) {
        PLAYER_LIST[id].pressKeyAttack = data[id];
    }
})

document.onkeydown = function(e) {
    // Player.pressKeyAttack = 1
    if (e.keyCode == 32) socket.emit("keypress", { key: 1, value: 1 });
}

document.onkeyup = function(e) {
    // Player.pressKeyAttack = 0
    if (e.keyCode == 32) socket.emit("keypress", { key: 1, value: 0 });
}

Моя проблема:

Пример: я являюсь игроком в игре (называемый Player_A) и некоторыми другими игроками.Когда Player_A нажимает [Пробел] вниз и вверх так быстро, другие игроки не могут получать данные (pressKeyAttack = 1) от Player_A, потому что данные Loop Send выполняют 10 FPS (отправлять каждые 100 мс), Player_A.pressKeyAttack равны 1 и возвращаются к 0 в50 мс.

Похоже:

at 0ms: Player_A.pressKeyAttack = 0;

at 20ms: Player_A.pressKeyAttack = 1; //Player press down

at 50ms: Player_A.pressKeyAttack = 0; //Player press up

at 100ms: Loop Data Run - Player_A.pressKeyAttack = 0.

На самом деле это было 1. Как я могу это исправить?

...