2013-10-05 26 views
1

Я пытаюсь подсчитать время, когда игрок удерживает кнопку мыши. Я попытался это, но он не работает:Каков лучший способ получить время удержания мыши?

var Game = cc.Layer.extend({ 
    count: false, 
    countTimer: null, 

    init: function() { 
     var selfPointer = this; 

     this.canvas.addEventListener('mousedown', function(evt) { 
      selfPointer.count = true; 
      selfPointer.countTimer = window.setTimeout(selfPointer.Count(), 1); 
     }); 

     this.canvas.addEventListener('mouseup', function(evt) { 
      selfPointer.count= false; 
      window.clearTimeout(selfPointer.countTimer); 
     }); 
    }, 

    Count: function() { 
     if (this.count) 
     { 
      window.setTimeout(this.Count(), 1); 
     } 
    } 

Это часть моего кода (для краткости), что я хочу сделать это действие любого 1 milisecond, если игрок держит кнопку.

Это не работает, я полагаю, что это лучший способ сделать это, чем мой путь. Есть идеи?

+0

JS clockbeats, как правило, намного больше, чем 1мс, поэтому вы не можете выполнить код, который часто. 10 мс все еще 1/100-й секунды, и о минимальной детализации интервалов и тайм-аутов. Я считаю, что IE составляет 11,4 мс, а хром - ближе к 8 мс. даже 12 мс интервалов достаточно для большинства игр; способный ~ 90FPS. – dandavis

+0

@ dandavis приятная информация! не знал этого. спасибо – DontVoteMeDown

ответ

2

Почему вы используете таймаут для этой простой задачи? Вы можете просто получить время mousedown, время mouseup и рассчитать разницу из них. Во всяком случае, разрешение таймера в браузерах меньше 1 мс. Прочитайте this article Николя Закаса, чтобы узнать больше о временном разрешении.

Кодекс:

var Game = cc.Layer.extend({ 
    init: function() { 
    var holdStart = null, 
     holdTime = null; 

    this.canvas.addEventListener('mousedown', function(evt) { 
     holdStart = Date.now() 
    }); 

    this.canvas.addEventListener('mouseup', function(evt) { 
     holdTime = Date.now() - holdStart; 
     // now in holdTime you have time in milliseconds 
    }); 
} 
+0

'holdTime' должен быть' holdTime = Date.now() - holdStart; ' – sinisterOrange

1

Вы могли бы использовать что-то вроде этого: http://jsfiddle.net/yE8sh/

//Register interval handle 
var timer; 
$(document).mousedown(function(){ 
    //Starts interval. Run once every 1 millisecond 
    timer=self.setInterval(add,1); 
}); 
$(document).mouseup(function(){ 
    //Clears interval on mouseup 
    timer=window.clearInterval(timer); 
}); 

function add(){ 
    //The function to run 
    $("body").append("a"); 
} 
2

Ну, если вы ориентируетесь новые браузеры, которые HTML5 совместимы вы можете использовать веб рабочих для такого рода задач. Просто отправьте сообщение веб-работнику на нажатие мыши, чтобы запустить таймер. Веб-работник может отправлять сообщение через каждые 1 мс, чтобы вызвать действие в игре, а затем на выгрузке мыши, отправить сообщение другому веб-работнику, чтобы он остановил его.

Вот лишь краткий пример того, как это будет работать. Вам нужно будет запускаться с локального сервера, чтобы работать веб-рабочими.

Game.js

function start() {    
    var worker = new Worker("ActionTrigger.js"); 
    worker.addEventListener('message', function(objEvent) { 
     console.log("Holding"); 
    }); 
    worker.postMessage("start"); 

    window.onmousedown = function() { 
     console.log("Mouse press"); 
     worker.postMessage("startTrigger"); 
    } 

    window.onmouseup = function() { 
     console.log("Mouse release"); 
     worker.postMessage("endTrigger"); 
    } 
} 

ActionTrigger.js

var trigger = false; 
var interval = 1; 

self.addEventListener('message', function(objEvent) { 
    if(objEvent.data == 'startTrigger') 
     trigger = true; 
    else if(objEvent.data == 'endTrigger') 
     trigger = false; 
    else if(objEvent.data == 'start') 
     timerCountdown(); 
}); 

function timerCountdown() { 
    if(trigger) 
     postMessage(""); 
    setTimeout(timerCountdown,interval); 
} 
Смежные вопросы