【cocos2d-js】1.自定义鼠标监听类,添加双击效果
第一次发文,而且我自学cocos2d-js才一个月多,写的不好请见谅。
因为最近无聊,想写个扫雷的小游戏,但是扫雷需要监听单击、双击、右键,显然cocos2d-js是没有的,所以这里我自定义了一个类,给大家分享下。
var LieListener = cc.Class.extend({
listener : null,
/**
* 左键单击
* @param event {cc.EventMouse}
* @returns {Boolean}
*/
onLeftButton : function(event) {
cc.log("left button");
return true;
},
/**
* 双击
* @param event {cc.EventMouse}
* @returns {Boolean}
*/
onDoubleClick : function(event) {
cc.log("double click");
return true;
},
/**
* 右键
* @param event {cc.EventMouse}
* @returns {Boolean}
*/
onRightButton : function(event) {
cc.log("right button");
return true;
},
updateLeft : function() {
this.isLeft = false; // 该this实际为event.getCurrentTarget()对象,而不是该类
},
ctor : function() {
var self = this;
// listener只重写onMouseDown方法,可根据自己需要添加其它方法,但该方法最好不要改
this.listener = cc.EventListener.create({
event : cc.EventListener.MOUSE,
onMouseDown : function(event) {
var target = event.getCurrentTarget();
// cc.EventMouse.BUTTON_LEFT代替0也可以
if(event.getButton() == 0){
if(target.isLeft==undefined || target.isLeft==false){
target.isLeft = true;
// 双击最长时间延迟,可修改延迟,太长的延迟会出现调用多次scheduleOnce,故自己需加布尔值判断:若更新中则不允许再次调用scheduleOnce,该布尔值最好放到target内,因为updateLeft实际上内部对象this是它,而不是LieListener 。
target.scheduleOnce(self.updateLeft, 0.25);
return self.onLeftButton(event);
}else{
target.isLeft = false;
return self.onDoubleClick(event);
}
}
// cc.EventMouse.BUTTON_RIGHT值为2,跟电脑测过右键值为1,不知官方修复了没
else if(event.getButton() == 1){
target.isLeft = false;// 双击的上一次单击必为左键
return self.onRightButton(event);
}
return false;
}
});
}
})
/**
* 方便创建重写监听方法的对象
*/
LieListener.create = function(object) {
// 校检参数类型是否为函数
var isFun = function(func) {
if(typeof(func) == "function")
return true;
return false;
}
var lis = new LieListener();
if(isFun(object.onLeftButton))
lis.onLeftButton = object.onLeftButton;
if(isFun(object.onDoubleClick))
lis.onDoubleClick = object.onDoubleClick;
if(isFun(object.onRightButton))
lis.onRightButton = object.onRightButton;
return lis; // 若直接返回lis.listener也是可以的
}
双击监听的大概的思路就是:如果是单击了左键,则给target添加个一次性的计划,在这个时间内又单击了左键,才是双击效果;若单击左键,下一次不为左键则取消双击状态。
调用例子:
var size = cc.winSize;
var sprite = new cc.Sprite(res.CloseNormal_png);
sprite.setPosition(size.width/2, size.height/2);
this.addChild(sprite);
cc.eventManager.addListener(LieListener.create({
// 自己重写
onLeftButton : function(event) {
cc.log(event.getLocation().x);
return true;
},
onDoubleClick : function(event) {
cc.log(event.getLocation().x);
return true;
}
}).listener, sprite);