#javascript
#javascript
Вопрос:
Я пытаюсь создать игровые часы, в которых каждый игровой час равен 3 минутам реального времени. Но по какой-то причине мне трудно разобраться в этом. Я придумал этот наполовину рабочий бит с циклом в 3 минуты на каждый час, поэтому он показывает только полные «игровые часы», которые я сбрасываю один раз выше 23, чтобы начать новый день. Полагаю, мне пришлось бы обновить цикл до точности часов игрового времени?
var hours;
if (process.argv.length > 2) {
// setting the clock
hours = parseInt(process.argv.slice(2));
}
console.log(hours);
let timerId = setInterval(function() {
hours = hours 1
if (hours > 23) {
hours = 0;
}
console.log(hours);
}, 3 * 60 * 1000);
Комментарии:
1. Я не понимаю вопроса. Вы хотите, чтобы он показывал время точнее, чем час?
2. Вы должны сохранить время начала. Затем разделите время с момента запуска на отношение реального времени к игровому, например 3600/180.
3. Да, это именно то, что я пытаюсь сделать. Звучит как хорошая идея
Ответ №1:
Да, вам пришлось бы иметь гораздо более быстрый интервал повторения, на уровне игровых секунд. Если один игровой час равен 3 реальным минутам, то игровое время на самом деле проходит в 20 раз быстрее реального, и поэтому одна игровая секунда будет длиться 1/20 реальных секунд, то есть 50 миллисекунд.
const speed = 20; // how many times faster than real time
let clockDiv = document.querySelector("#clock");
let gameStartTime = 0; // game-milliseconds;
let realStartTime = Date.now(); // real milliseconds
let timerId = setInterval(function() {
let gameTime = gameStartTime (Date.now() - realStartTime) * speed;
let sec = Math.floor(gameTime / 1000) % 60;
let min = Math.floor(gameTime / 60000) % 60;
let hour = Math.floor(gameTime / 3600000) % 24;
// output in hh:mm:ss format:
clockDiv.textContent = `${hour}:${min}:${sec}`.replace(/bdb/g, "0$amp;");
}, 50);
<div id="clock"></div>
Комментарии:
1. Это работает замечательно. Хотя мне интересно, может ли обновление каждые 50 мс быть слишком жестким для вычислений? Или мне не нужно беспокоиться об этом?
2. Об этом не беспокойтесь. Если у вас интенсивные вычисления в других частях вашего кода, они просто будут выполняться до завершения, прежде чем очередь событий будет использована снова.
3. @F.Rakes Приведенный выше код пересчитывает игровое время с нуля при каждом тике, поэтому можно 1. увеличить интервал, если вы чувствуете, что это замедляет работу (хотя компьютеры могут делать намного больше при скорости 20 кадров в секунду); 2. даже если обработчик задерживается, код правильный (на самом деле вам не следует полагаться на таймеры, срабатывающие точно или даже близко к выбранному интервалу, особенно в JS.)
Ответ №2:
Я полностью уверен, в чем ваша проблема, но @ 3 минуты реального времени = 1 час игрового времени, 1 реальная секунда = 20 игровых секунд. 3600 / 180 = 20. Вы должны иметь возможность вводить игровые секунды в любую обычную функцию времени, чтобы получать минуты / часы и т.д.