在cocos2dx-js里面,你为每个节点添加鼠标事件就得添加一段类似下面的代码:

var node = 当前需要添加鼠标事件的节点
var listener = cc.EventListener.create({
event : cc.EventListener.MOUSE,
onMouseDown : function(event){
... //按下鼠标处理
},
onmouseup : function(event){
... //松开鼠标处理
},
onMouseMove : function(event){
... //移动鼠标处理
},
onMouseScroll : function (event) {
... //滑动鼠标滑轮处理
}
});
cc.eventManager.addListener(listener,node);

并且这里还有注意需要处理的地方.例如你给一个精灵添加鼠标事件后,每当你按下鼠标时它都会触发onMouseDown(),但是这时也许鼠标的位置并不在精灵上面,所以你还得判断鼠标位置才进行后面的处理(除非你就是想要这样的效果).
这是个烦琐过程.下面的鼠标事件管理器就是为了解决这个烦琐过程.
MouseManager.js文件:
var MouseManager = {};
MouseManager.m_bPropagation = true; //传递事件标志(一个总控制)
MouseManager.m_pTypeCode = {
"mousedown" : 1,//000001
"mouseenter" : 2,//000010
"mousemove" : 4,//000100
"mouseleave" : 8,//001000
"mouseup" : 16,//010000
"mousewheel" : 32 //100000
};
MouseManager.enablePropagation = function (propagation) {
MouseManager.m_bPropagation = propagation;
};
MouseManager.mouseDown = function (event) {
var node = event.getCurrentTarget();
var event_node = MouseManager._getEventNode(node);
if (!event_node) {
return;
}
var pos = event.getLocation();
//cc.log("->MouseManager::pressDown x = " + pos.x + ",y = " + pos.y);
var propagation = MouseManager.m_bPropagation;
var nsize = node.getContentSize();
var npos = node.convertToWorldspace(cc.p(0,0));
var nrect = cc.rect(npos.x,npos.y,nsize.width,nsize.height);
if (node.isVisible() && cc.rectContainsPoint(nrect,pos)) {
//on mouse down
if (event_node["mousedown"] && typeof event_node["mousedown"].cb == 'function') {
if (event_node["mousedown"].target) {
event_node["mousedown"].cb.call(event_node["mousedown"].target,event);
} else {
(event_node["mousedown"].cb)(event);
}
}
event_node.downtag = 1;
//stop propagation
if (!propagation) {
event.stopPropagation();
}
}
};
MouseManager.mouseUp = function (event) {
var node = event.getCurrentTarget();
var event_node = MouseManager._getEventNode(node);
if (!event_node) {
return;
}
var pos = event.getLocation();
//cc.log("->MouseManager::pressUp x = " + pos.x + ",y = " + pos.y);
var nsize = node.getContentSize();
var npos = node.convertToWorldspace(cc.p(0,nsize.height);
if (event_node.downtag == 1 && node.isVisible() && cc.rectContainsPoint(nrect,pos)) { //event_node.downtag == 1 &&
//on mouse up
if (event_node["mouseup"] && typeof event_node["mouseup"].cb == 'function') {
if (event_node["mouseup"].target) {
event_node["mouseup"].cb.call(event_node["mouseup"].target,event);
} else {
(event_node["mouseup"].cb)(event);
}
}
}
event_node.downtag = 0;
};
MouseManager.mouseMove = function (event) {
var node = event.getCurrentTarget();
var event_node = MouseManager._getEventNode(node);
if (!event_node) {
return;
}
var pos = event.getLocation();
//cc.log("->MouseManager::mouseMove x = " + pos.x + ",pos)) {
//on mouse enter
if (!event_node.movetag || event_node.movetag == 0) {
if (event_node["mouseenter"] && typeof event_node["mouseenter"].cb == 'function') {
if (event_node["mouseenter"].target) {
event_node["mouseenter"].cb.call(event_node["mouseenter"].target,event);
} else {
(event_node["mouseenter"].cb)(event);
}
}
}
event_node.movetag = 1;
//on mouse move
if (event_node["mousemove"] && typeof event_node["mousemove"].cb == 'function') {
if (event_node["mousemove"].target) {
event_node["mousemove"].cb.call(event_node["mousemove"].target,event);
} else {
(event_node["mousemove"].cb)(event);
}
}
//stop propagation
if (!propagation) {
event.stopPropagation();
}
} else {
if (event_node.movetag == 1) {
if (event_node["mouseleave"] && typeof event_node["mouseleave"].cb == 'function') {
if (event_node["mouseleave"].target) {
event_node["mouseleave"].cb.call(event_node["mouseleave"].target,event);
} else {
(event_node["mouseleave"].cb)(event);
}
}
}
event_node.movetag = 0;
}
};
MouseManager.mouseScroll = function (event) {
var node = event.getCurrentTarget();
var event_node = MouseManager._getEventNode(node);
if (!event_node) {
return;
}
var pos = event.getLocation();
//cc.log("-> mouse scroll pos = " + pos.x + "," + pos.y);
var propagation = MouseManager.m_bPropagation;
var nsize = node.getContentSize();
var npos = node.convertToWorldspace(cc.p(0,pos)) {
//on mouse scroll
if (event_node["mousewheel"] && typeof event_node["mousewheel"].cb == 'function') {
if (event_node["mousewheel"].target) {
event_node["mousewheel"].cb.call(event_node["mousewheel"].target,event);
} else {
(event_node["mousewheel"].cb)(event);
}
}
//stop propagation
if (!propagation) {
event.stopPropagation();
}
}
};
MouseManager.isMouseType = function (event_type) {
if (event_type == "mousedown" || event_type == "mouseenter" || event_type == "mousemove" || event_type == "mouseleave" || event_type == "mouseup" || event_type == "mousewheel") {
return true;
}
return false;
};
MouseManager._getEventNode = function (node) {
return node._a_event_node;
};
MouseManager._createEventNode = function (node) {
event_node = {};
event_node.node = node;
event_node.typecode = 0;
event_node.listener = cc.EventListener.create({
event : cc.EventListener.MOUSE,
onMouseDown : function(event){
MouseManager.mouseDown(event);
},
onmouseup : function(event){
MouseManager.mouseUp(event);
},
onMouseMove : function(event){
MouseManager.mouseMove(event);
},
onMouseScroll : function (event) {
MouseManager.mouseScroll(event);
}
});
cc.eventManager.addListener(event_node.listener,node);
node._a_event_node = event_node;
return event_node;
};
MouseManager._deleteEventNode = function (node) {
if (!node._a_event_node) {
return;
}
if (node._a_event_node.listener) {
cc.eventManager.removeListener(node._a_event_node.listener);
}
node._a_event_node = null;
};
MouseManager.on = function (type,node,cb,target) {
if (!MouseManager.isMouseType(type) || !node || typeof cb != 'function') {
return;
}
var event_node = MouseManager._getEventNode(node);
if (!event_node) {
event_node = MouseManager._createEventNode(node);
}
event_node[type] = {cb : cb,target : target};
event_node.typecode |= MouseManager.m_pTypeCode[type];
};
MouseManager.off = function (type,node) {
if (!MouseManager.isMouseType(type) || !node) {
return;
}
var event_node = MouseManager._getEventNode(node);
if (!event_node) {
return;
}
var maskcode = ~MouseManager.m_pTypeCode[type];
event_node.typecode &= maskcode;
if (event_node.typecode == 0) {
MouseManager._deleteEventNode(node);
} else {
event_node[type] = null;
}
};
MouseManager.offNode = function (node) {
if (!node) {
return;
}
MouseManager._deleteEventNode(node);
};

对应事件名
* mousedown 当鼠标在目标节点区域按下时触发一次
* mouseenter 当鼠标移入目标节点区域时,不论是否按下
* mousemove 当鼠标在目标节点在目标节点区域中移动时,不论是否按下
* mouseleave 当鼠标移出目标节点区域时,不论是否按下
* mouseup 当鼠标从按下状态松开时触发一次
* mousewheel 当鼠标滚轮滚动时触发

调用示例: var node = new cc.Sprite("res/test.png"); node.setPosition(500,300); parent_node.addChild(node); //添加鼠标事件侦听,当鼠标移进/移出精灵时进行处理 MouseManager.on("mouseenter",function(event) { //event是cc.EventMouse结构 event.stopPropagation(); //停止事件传递 var target = event.getCurrentTarget(); //当前事件触发节点 cc.log("->mouse enter sprite"); }); MouseManager.on("mouseleave",function(event) { event.stopPropagation(); cc.log("->mouse leave sprite"); }); //移除鼠标事件侦听,当不需要时可以一个一个地移除对应的侦听,也可以一次性移除所有侦听 MouseManager.off("mouseenter",node); MouseManager.off("mouseleave",node); 或 MouseManager.offNode(node);

cocos2dx-js 鼠标事件管理器的更多相关文章

  1. 利用Node实现HTML5离线存储的方法

    这篇文章主要介绍了利用Node实现HTML5离线存储的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. Html5 滚动穿透的方法

    这篇文章主要介绍了Html5 滚动穿透的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. HTML5 拖放(Drag 和 Drop)详解与实例代码

    本篇文章主要介绍了HTML5 拖放(Drag 和 Drop)详解与实例代码,具有一定的参考价值,有兴趣的可以了解一下

  4. 跨域修改iframe页面内容详解

    这篇文章主要介绍了跨域修改iframe页面内容详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 使用带有NodeJs HTTPS的certificates.cer

    我为IOS推送通知生成了一个.cer文件,我希望将它与NodeJSHTTPS模块一起使用.我发现HTTPS模块的唯一例子是使用.pem和.sfx文件,而不是.cer:有解决方案吗解决方法.cer文件可以使用两种不同的格式进行编码:PEM和DER.如果您的文件使用PEM格式编码,您可以像使用任何其他.pem文件一样使用它(有关详细信息,请参见Node.jsdocumentation):如果您的文件使

  7. ios – 暂停调度队列是否会暂停其目标队列?

    我想创建两个串行队列A&B.队列B是队列A的目标.我想在B上排队一些块,并暂停它直到我准备执行它们,但是我想继续在队列A上执行块.如果我暂停B,这还会暂停它的目标队列(队列A)吗?我的想法是,我想安排这些特定的块在稍后日期执行但是我不希望它们同时运行而我不这样做想要处理信号量.但我希望队列A继续处理它的块,而B则被暂停如果不清楚这里是一些示例代码解决方法queueB被挂起,但queueA未被挂起.queueA和queueB被挂起.

  8. ios – 使用CocoaPods post install hook将自定义路径添加到HEADER_SEARCH_PATHS

    解决方法在Podfile中定义一个方法:然后在post_install中调用该方法:

  9. ios – 在Swift中删除WKWebView Accesory栏

    我现在正试着将this转换成Swift而没有真正的背景.这是我到目前为止所得到的…而且我一直在寻找谷歌并不知道要搜索什么才能更具体.你能否详细说明我做错了什么?

  10. iOS,ld:framework没有找到适用于架构arm64的GoogleMaps

    Podfile看起来像这个Cocoapodsv1.0beta6):解决方法更新请检查您是否在架构中具有相同的构建设置,并仅构建活动体系结构中的目标键你的podfile应该是这样的在您启动ProjectTest目标之前结束项目目标,也是为什么添加继承!

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部