Я пишу карточную игру, в которой есть один и многопользовательский режим. В случае игры с одним игроком скрипт генерирует ходы в ответ на действия игрока. Моя проблема заключается в том, что этот скрипт движется мгновенно, и я хочу, чтобы игрок почувствовал, что ИИ «думает» на своем ходу, поэтому подождите с каждым ответом, прежде чем отображать его в течение 2 секунд.Как обрабатывать ответы на веб-сайт последовательным образом с использованием интервала в javascript?
Поскольку я использую архитектуру браузера + сервера с клиентом javascript, это ожидание довольно проблематично. Код, который у меня есть в настоящее время, не ведет себя так, как я хочу. Идея заключается в том, что когда ответ приходит от клиента websocket и генерируется ai, ответ отправляется в очередь. И есть интервал, который выполняется каждые 2 секунды и пытается выставить эту очередь. Вот мой код:
// interval
var responseQueue = [];
$interval(function() {
var response = responseQueue.shift();
if (response !== undefined) {
processResponse(response);
}
}, OPPONENT_MOVE_REFRESH_INTERVAL);
// websocket response
SocketFactory.subscribe("/user/queue/game.gameResponse", function (response) {
var res = JSON.parse(response.body);
// the current player moved, refreshing view
if ($scope.username === res.currentPlayerId) {
processResponse(res);
} else {
// the opponent moved (the ai in this case)
responseQueue.push(res);
}
});
То, что я получаю, является чем-то вроде случайного поведения. Карты появляются, но не через 2 секунды, и иногда данные теряются. Что я делаю не так?
Примечание: игрок может перемещаться более одного раза, поэтому иногда я получаю 2-3 движения AI в быстрой последовательности.
Если вы используете push() для заполнения, используйте pop() для удаления. или используйте unshift() вместо push(), иначе ваша очередь не будет выполнена в правильном порядке. лично, я бы просто установилTimeout() действие ответа и избежать сложности очереди. – dandavis
Я говорю, что вам не нужна очередь. замените 'responseQueue.push (res);' с 'setTimeout (function() {processResponse (res);}, 2000)' для задержки каждого действия 2 секунды. три быстрых действия все равно будут происходить быстро (сгруппированы вместе), но вся последовательность не начнется только после 2-секундной паузы, что должно быть очень естественным, если вы поймете свою игру. – dandavis
Мне не нужны кластерные действия, потому что игроку нужно понять, почему произошло каждое движение. –