Я создаю игру и использую Javascript SetTimeout. Я хочу отслеживать время между каждым движением мыши, и для этого я использую SetTimeout. Проблема в том, что SetTimeout ВСЕГДА вызывается каждые x секунд (например, SetInterval). Я некоторое время смотрел на этот код и, может быть, я неправильно понял, что делает SetTimeout?
Повторяю, моя цель - измерить время между каждым "стоком" мыши и, как представляется, SetTimeout вызывается КАЖДОЕ x миллисекунды вместо одного раза. Пожалуйста, ознакомьтесь с приведенным ниже кодом для получения дополнительной информации.
Опять же, я хотел бы определить "удар" мыши с помощью SetTimeout. После "штриха" мыши (например, рисования линии) происходит пауза (в этом случае я определил это как 25 миллисекунд).
<html>
<head>
<title> My Game </title>
<script type="text/javascript">
timeout = null;
document.onmousemove = function(e) {
var event = e || window.event;
mouseX = event.clientX;
mouseY = event.clientY;
console.log(mouseX+","+mouseY);
clearTimeout(timeout);
timeout = window.setTimeout(
function(){alert("New Mouse Movement")
},25);
}
</script>
</head>
<body>
</body>
</html>
Основываясь на моем комментарии, просто введите нулевое время. Затем, когда мышь перемещается, она устанавливает время начала и устанавливает таймер на 0,025 секунды. Если мышь продолжает двигаться, тогда она очистит таймаут и снова запустит таймер. Если мышь перестает двигаться, функция таймаута срабатывает и запишет время, потраченное на перемещение.
timeout = null;
mouseStart=null;
document.onmousemove = function(e) {
var event = e || window.event;
if(mouseStart===null){
mouseStart=new Date();
}
mouseX = event.clientX;
mouseY = event.clientY;
console.log(mouseX+","+mouseY);
clearTimeout(timeout);
timeout = window.setTimeout(
function(){
console.log((new Date()).getTime()-mouseStart.getTime())
mouseStart=null;
},25);
}
Fiddle, переместите мышь по кругу, и как только вы остановитесь, вы получите прошедшее время движения мыши в миллисекундах (+25 миллисекунды): http://jsfiddle.net/rr4g2/
ПРИМЕЧАНИЕ. 25 миллисекунд - это хелла быстро. Вы можете захотеть что-то вроде 300 миллисекунд, чтобы сделать немного более понятным, что мышь перестала двигаться.
Вы alert
о новом движении мыши 25 мс после того, как это произойдет, а не о том, как долго пробел между ними. setTimeout
- это не то, что вам нужно.
Вместо этого, на каждом движении мыши сохраняйте текущее время и вычитайте из него предыдущее время, затем alert
этом.
Изменение: я mousemove
alert
для console.log
так как mousemove
будет работать так часто.
var oldTime = Date.now();
document.onmousemove = function (e) {
var event = e || window.event;
mouseX = event.clientX;
mouseY = event.clientY;
console.log(mouseX+","+mouseY);
// Get the current time.
var newTime = Date.now();
// Alert the difference.
console.log('Time between mouse strokes: ' + (newTime - oldTime) + 'ms');
// Save the current time for the next movement.
oldTime = newTime;
};
setTimeout()
используется для постановки в очередь функции, которая будет выполняться после указанной задержки. Он не предназначен для измерения времени между двумя событиями. Один вызовsetTimeout()
приведет к тому, что указанная вами функция будет выполняться только один раз, а не несколько раз каждые x миллисекунд, но ваш код вызываетsetTimeout()
при каждом событии mousemove. Проверьте вашу консоль - вы увидите, что вашconsole.log()
происходит один раз за время ожидания ...