У меня есть игра на стороне сервера, обновите логику с 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. Как я могу это исправить?