获得鼠标保持时间的更好方法是什么?

时间:2013-10-05 18:26:57

标签: javascript cocos2d-iphone cocos2d-html5

我正在计算玩家按住鼠标按钮的时间。我尝试了这个,但它不起作用:

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毫秒内执行操作。

这不起作用,我认为这是一种比我的方式更好的方法。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

如果您要定位与HTML5兼容的新浏览器,那么您可以使用网络工作人员执行此类任务。只需在鼠标按下时向Web工作人员发送消息即可启动计时器。网络工作者可以每1毫秒发布一条消息,以触发您的游戏操作,然后在鼠标释放时,向网络工作人员发送另一条消息,告知其停止。

这里只是一个快速举例说明它是如何工作的。您需要从本地服务器运行才能让Web工作人员正常工作。

<强> 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);
}

答案 1 :(得分:2)

为什么在这个简单的任务中使用超时?您可以获得mousedown的时间,mouseup的时间并计算它们的差异。无论如何,浏览器中的计时器分辨率小于1毫秒。阅读Nickolas Zakas的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
    });
}

答案 2 :(得分: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");
}