Создание вымышленного игрового времени / часов

#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. Вы должны иметь возможность вводить игровые секунды в любую обычную функцию времени, чтобы получать минуты / часы и т.д.