Я только что сделал многопользовательскую реализацию браузера игры Pong, используя socket.io, и у вас возник вопрос о логистике реального времени. В основном игровой манипулятор - это только цветной div, который перемещается вверх или вниз в зависимости от того, какую кнопку они нажимают. Я заметил, что при тестировании моей программы на двух разных компьютерах с использованием AWS было почти идеально синхронизировано, но иногда не точное. Для игрока, который управляет веслом, перемещение их весла выполняется локально, но для человека, которого он играет против сервера, постоянно отправляет им данные о том, движется ли их противник вверх или вниз.Позиция игрока на стороне сервера или на стороне клиента?
Вопрос в том, должен ли я делать все движения на стороне сервера? Как пользователь нажимает, чтобы подняться, и он отправляет серверу запрос, который испускает обоих игроков, что весло должно двигаться, или мой способ, когда движение для вашего весла выполняется локально нормально?
Мой код прямо сейчас выглядит следующим образом:
проверки на стороне клиента, если вверх или вниз кнопки нажимается и испуская запрос перемещения:
paddleMove = 0; // Keep track of which direction to move
speed = 5;
if (paddleL.position().top > arena.position().top){ // If left paddle not at top
if (keysPressed.up) paddleMove -= speed;
}
if (paddleL.position().top+paddleL.height() < arena.position().top + arena.height() - 15){ // If left paddle not at bottom
if (keysPressed.down) paddleMove += speed;
}
paddleL.css({ // Move paddle locally
top: paddleL.cssNumber('top') + paddleMove + 'px'
});
socket.emit("moveReq", paddleMove); // Send to server
Вышеприведенный код находится в интервале, который проходит каждую фракцию Второй.
Затем на стороне сервера выглядит следующим образом:
socket.on('moveReq', function(data){ // Send to opponent that other paddle moved
socket.broadcast.emit("movePaddle", data);
});
Что в предупреждениях своей очереди другая часть пользовательского кода на стороне, чтобы переместить другую ракетку:
socket.on("movePaddle", function(data){
var paddleMove = 0;
paddleMove += data; // Data is speed (direction) of movement
paddleR.css({ // Move right paddle
top: paddleR.cssNumber('top') + paddleMove + 'px'
});
Как я уже говорил, движение сейчас довольно хорошо, но не идеально. Должен ли я сделать ни одно из локальных движений и не сделать все это на сервере?
Имо вы должны делать движения на стороне клиента и синхронизации с серверной стороной в определенные моменты времени, в данном случае, когда мяч сенсорной ракетку, так что вы будете предотвратить перегрузку сервера и предотвратить взлом , –