cocos中的观察者模式 以及"点击事件"的注册和分发(个人理解)

一、控件的点击事件注册与完成

在学习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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值