Сценарий, чтобы измерить течение времени?
В настоящее время я разрабатываю небольшую игру для класса с использованием Crafty, и наша игра требует времени. Для контекста это игра, похожая на тамагочи, в которой игрок контролирует существо и кормит его, ухаживает за ним и т. Д., Когда это необходимо, поэтому нам нужно измерить время для таких вещей, как "каждые пять минут животное будет голодным" или "через некоторое время (скажем, 20 минут) существо умрет от естественных причин, и игра закончится". Моя проблема в том, что я не уверен, как лучше всего это сделать. Должен ли я использовать setInterval? SetTimeout? Мой собственный класс таймера? Я не знаю, что является наиболее распространенным решением для подобных случаев. Пока что я попробовал первые два варианта без успешных результатов.
Я также пытался искать какие-то хитрые функции на время; и ближе всего я мог найти Crafty.bind("EnterFrame", function() { ... })
Так что я мог "манипулировать" временными рамками, но это тоже не сработало. Заранее спасибо.
2 ответа
Когда игра начнется, получите отметку времени с new Date().getTime()
и держите его в переменной. На регулярных интервалах (вы можете использовать setInterval), сравните это с текущей отметкой времени и действуйте в соответствии с тем, сколько времени прошло.
Я предлагаю создать массив с синхронизированными событиями и проверить его элементы из обратного вызова таймера. Что-то вроде этого:
var startTime = new Date().getTime();
// List of timed events
// (times are in milliseconds)
var events = [
{ time: 5000, text: "do something after 5 secs"},
{ time: 10000, text: "do something after 10 secs"},
{ time: 20000, text: "do something after 20 secs"}
];
// Check for events every second
setInterval(function() {
var timePassed = new Date().getTime() - startTime;
console.log("passed: " + timePassed + " milliseconds");
// Check all events
for(var i=events.length-1; i>=0; i--) {
// If an event has expired, remove it from the list,
// (and do whatever tou need to do)
if(events[i].time <= timePassed) {
// log the event text to the console
console.log(timePassed + "ms passed. " + events[i].text);
// remove from array
events.splice(i, 1);
}
}
}, 1000);
ДЕМО (откройте консоль браузера, чтобы увидеть вывод).
Вместо того чтобы использовать одну временную метку, как в ответе bfavartto, вы можете расширить ее, чтобы установить несколько динамических временных меток в массиве (или объекте) времени или даже просто как отдельные переменные, а затем обновить их по мере выполнения действий.
Простая версия будет что-то вроде:
// Initialize the variables at the beginning of the game
var lifeStamp = new Date().getTime();
var foodStamp = lifeStamp ;
var groomStamp = lifeStamp ;
function feed() {
/*** Do feed-realted stuff here ***/
// reset the "feed" timestamp
foodStamp = new Date().getTime();
}
function groom() {
/*** Do groom-realted stuff ***/
// reset the "groom" timestamp
groomStamp = new Date().getTime();
}
Таким образом, вы можете сохранить свои интервалы, но сбросить их, сбросив временные метки, с которыми ваши интервалы сравниваются для разных типов действий. В то же время временная метка "жизни" останется прежней, а остальные изменились.
Редактировать: Пересматривая ответ bfavartto, похоже, вам нужно будет сохранить и "оригинальный" список любых событий, относящихся к конкретному действию, чтобы при сбросе меток времени вы могли сбросить действия, которые к ним относятся,
Редактировать № 2: еще одна вещь.,, если вы хотите, чтобы эти существа сохранялись после текущей загрузки страницы, вы можете захотеть использовать куки или HTML5 LocalStorage
хранить эти метки времени. Это позволило бы вам (практически) использовать гораздо более длительные интервалы, а также позволить пользователям покинуть страницу и вернуться, чтобы продолжить с того места, где они остановились (хотя, я полагаю, было бы значительное количество других данных, которые должны быть сохранены, чтобы пользователи могли уходить и возвращаться).