概述
Cocos2d-x-lite 通过事件分发机制响应用户事件,已内置支持常见的事件如触摸事件,键盘事件等。同时提供了创建自定义事件的方法,满足我们在游戏的开发过程中,特殊的事件响应需求。
本分分析源码是基于 cocos creator 2.3.1 版本源码进行的
监听事件
在游戏中注册一个监听有下面的几种方法:
第一种:
在脚本中声明函数:
1 | btnClick1: function (event, customEventData) { |
然后在编辑器中添加事件。
方法二:
1 | var clickEventHandler = new cc.Component.EventHandler(); |
1 | testEvtent(event, customEventData) { |
方法三:
1 | onLoad() { |
这种方式不能传递自定义数据,不推荐使用。
我们使用第二种方式创建一个事件监听。
那么,组件中是如何把我们注册的事件监听方法和事件联系起来的呢?
下来简单看一下 CCButton 的代码。
1 | // engine CCButton.js |
1 | // engine CCNode.js |
好了,这里就只需要静等click事件来就行了。
事件注册
接下来我们看一下事件的注册流程,了解一下事件如何与我们的回调函数联系起来的:
1 | ├── prepare // engine CCGame.js |
下面通过源码来看一下几个关键的方法。
1 | registerSystemEvent (element) { |
再来看看 jsb-adapter 是如何绑定这些事件和回调方法的。
1 | // jsb-adapter EventTarget.js |
事件分发
建立好事件和回调方法的联系后,下面我们就来看一下事件分发机制。
1 |
|
在 EventTarget.js 建立 c++ 和 js 的绑定。
1 | jsb.onTouchStart = touchEventHandlerFactory('touchstart'); |
收到 c++ 传递过来的事件后开始分发事件。
1 | function touchEventHandlerFactory(type) { |
这里的执行的回调方法就是前面 engine CCInputManager.js 中 registerSystemEvent 为改事件添加的回调方法。
我们接下来再看下面的执行流程。
1 | ├── handleTouchesBegin // engine CCInputManager.js |
1 | function _doDispatchEvent (owner, event) { |
下面就回到了 CCButton.js ,这里我们不再追踪 onTouchBegan ,因为这个事件的方法体里面没有干什么事情,只修改了一些状态位,click 事件是在 onTouchEnded 中触发的。
我们来看 onTouchEnded。
1 | _onTouchEnded (event) { |