一、控件的点击事件注册与完成
在学习cocos引擎时,感觉触摸事件用的比较频繁。 于是对各种触摸事件做一些小小的总结:
cocos中的控件(按钮,精灵,各种容器等)。在实际开发中发现他们都是可以添加点击事件的,可以通过设置setTouchEnabled()来开启点击,并通过addTouchEventListener()来注册点击事件回调方法。
个人理解到点击事件完成的原理是:cocos中的控件都是继承于父类 widget,在widget中存在这样一个方法 void Widget::addTouchEventListener(const ccWidgetTouchCallback& callback)
{
this->_touchEventCallback = callback;
}
这样子类就可以通过这个方法给控件注册点击事件;
问题是,这个事件是如何触发的,为什么会知道按钮被点击到了,并做出响应。
个人理解:在图形界面中:我们每一次点击 都会传入当前点击位置,在OpenGL中的世界坐标。在整个界面中的所有控件都被装在一个容器里,每次当用户点击一个地方,就会传入一个坐标,然后在容器中进行遍历,如果点击的区域是一个控件,且添加了点击事件,那就会触发当前控件的注册事件。
以上是纯个人的YY理解法,因为源代码并没有深入了解,目前是以一个菜鸟的思维这样记忆。以后看源代码再深究;
二、没有继承widget的节点的点击事件
在实际开发过程中,有时候会需要全屏的点击事件,比如给当前layer添加一个点击事件。但是CCLayer是继承自Node的,也就是说它没有addTouchEventListener()这个方法。
在开发过程中发现 cocos中有很多 self.listener = cc.EventListenerXXXXXX:create()
类似这种的事件注册方法。
比如点击事件:cc.EventListenerTouchOneByOne:create()
一般的事件注册:cc.EventListenerCustom:create(evtName,callback)
事件注册之后,现在要做的就是将这个事件与我们需要的Node联系起来。
cocos-lua中:
在Node节点中,有一个EventDispatcher* _eventDispatcher属性,可以通过getEventDispatcher()方法获取,
EventDispatcher类里面主要是通过一个vector存储所有要监听的事件,然后在接收信息时,遍历所有要监听的
消息,判断消息类型进行毁掉。
于是:
self.listener = cc.EventListenerTouchOneByOne:create() (这里的self.listener只是一个注册的事件类型(单机事件),但是并没有绑定回调函数)
self.listener:registerScriptHandler(func,cc.Handler.EVENT_TOUCH_BEGAN) (这是给listener绑定了具体回调方法func,并指明了类型为cc.Handler.EVENT_TOUCH_BEGAN(点击开始))
local eventDispatcher = self.layer:getEventDispatcher()(获得当前节点self.layer的事件分发器)
eventDispatcher:addEventListenerWithSceneGraphPriority(self.listener,self.layer)(-- 绑定触摸事件到层当中)
另一个 绑定的方法是
addEventListenerWithFixedPriority(self.listener,1)--(把监听事件添加到eventDispatcher,并且设置权重)
第一个SceneGraph 会在节点销毁时自动销毁eventDispatcher
第二个FixedPriority 可以添加监听并设置权重,在一个节点添加多个监听时比较有用。
以上。希望下次来看 会有新的认识!!upup