第一次看CCControl
Control中有九种可能的事件,定义在.h文件中,另外还定义四种状态,用来表示控件高亮等。
在初始化控件的时候:
bool Control::init()
{
if (Layer::init())
{
// Initialise instance variables
//初始化控件的状态
_state=Control::State::NORMAL;
//开启控件
setEnabled(true);
//不选中
setSelected(false);
//不高亮
setHighlighted(false);
//获取分发器
auto dispatcher = Director::getInstance()->getEventDispatcher();
//创建单点触摸监听器
auto touchListener = EventListenerTouchOneByOne::create();
//设置触摸吞没,触摸控件时,控件下的其它东西不会接触到触摸事件
touchListener->setSwallowTouches(true);
//创建触摸不同阶段的回调函数
touchListener->onTouchBegan = CC_CALLBACK_2(Control::onTouchBegan, this);
touchListener->onTouchMoved = CC_CALLBACK_2(Control::onTouchMoved, this);
touchListener->onTouchEnded = CC_CALLBACK_2(Control::onTouchEnded, this);
touchListener->onTouchCancelled = CC_CALLBACK_2(Control::onTouchCancelled, this);
//添加场景图优先级的触摸监听器,也就是说优先级为0
dispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);
return true;
}
else
{
return false;
}
}
添加场景图优先级的触摸监听器
void EventDispatcher::addEventListenerWithSceneGraphPriority(EventListener* listener, Node* node)
{
CCASSERT(listener && node, "Invalid parameters.");
CCASSERT(!listener->isRegistered(), "The listener has been registered.");
if (!listener->checkAvailable())
return;
//设置监听器的节点参数
listener->setAssociatedNode(node);
//设置优先级
listener->setFixedPriority(0);
//设置为注册
listener->setRegistered(true);
//添加给存储监听器的全局数组添加元素
addEventListener(listener);
}
添加事件监听器到全局数组中
void EventDispatcher::addEventListener(EventListener* listener)
{
if (_inDispatch == 0)
{
//直接添加
forceAddEventListener(listener);
}
else
{
//正在使用,延时添加
_toAddedListeners.push_back(listener);
}
#if CC_ENABLE_GC_FOR_NATIVE_OBJECTS
auto sEngine = ScriptEngineManager::getInstance()->getScriptEngine();
if (sEngine)
{
sEngine->retainScriptObject(this, listener);
}
#endif // CC_ENABLE_GC_FOR_NATIVE_OBJECTS
listener->retain();
}
直接添加
void EventDispatcher::forceAddEventListener(EventListener* listener)
{
EventListenerVector* listeners = nullptr;
//通过listener获取ID
EventListener::ListenerID listenerID = listener->getListenerID();
//通过ID查找是否在存储所有listener的map中,这个map是用来存储监听器ID和监听器数组的
auto itr = _listenerMap.find(listenerID);
//如果没找到
if (itr == _listenerMap.end())
{
//新建一个监听器数组类型
listeners = new (std::nothrow) EventListenerVector();
//和对应的ID一起加入map中
_listenerMap.emplace(listenerID, listeners);
}
else
{
//如果找到了就获取它的second,即存储listener的数组
listeners = itr->second;
}
//添加到对应ID的listeners中
listeners->push_back(listener);
//如果优先级是0
if (listener->getFixedPriority() == 0)
{
//设置场景图的优先级
setDirty(listenerID, DirtyFlag::SCENE_GRAPH_PRIORITY);
//获取关联节点
auto node = listener->getAssociatedNode();
CCASSERT(node != nullptr, "Invalid scene graph priority!");
//将节点和监听器放入_nodeListenersMap中
associateNodeAndEventListener(node, listener);
if (!node->isRunning())
{
listener->setPaused(true);
}
}
else
{
setDirty(listenerID, DirtyFlag::FIXED_PRIORITY);
}
}
要注意的地方是,fixedPriority事件是不绑定节点的。
setDirty看的还不是很明白,后补。
第一次看CCControl的更多相关文章
- 我的“第一次”,就这样没了:DDD(领域驱动设计)理论结合实践
写在前面 插一句:本人超爱落网-<平凡的世界>这一期,分享给大家. 阅读目录: 关于DDD 前期分析 框架搭建 代码实现 开源-发布 后记 第一次听你,清风吹送,田野短笛:第一次看你,半弯 ...
- 对于程序开发者看书(指实在的书而不是PDF)的好处。(个人看法而已)
书是实在的东西.不同PDF.他能带你进入一种学习态度的环境 书上已经所列了知识点.看了.那些知识点就是你的. 第一次看,未必完全理解到里面的东西.说不定过几天,几周,几个月,甚至几年.再看.就有可能看 ...
- 看牙与IT项目
周末为了一颗牙第五次去牙科诊所,得到的消息是:还需要观察至少2周才能做牙冠,同时发现了较深的牙结石需要做刮治,刮治疗需要2次.因此至少要再去医院3次.从去年的六月体检发现这颗牙的问题,目前最乐观估计也 ...
- 【前端童鞋看过来!】给大家分享网盘里前端相关书籍,主要是和网络通信(HTTP/TCP/IP)及javascript相关的
百度云链接:https://pan.baidu.com/s/1kUPdf5H(无密码) 截图: <HTTP权威指南> [豆瓣书评]:此书第一部分是HTTP的概略,如果你没有时间,通读第一部 ...
- 整合第二次(SSM第一次)------------>spring+struts2+mybatis
今天我们来讲解一下SSM整合,感觉整合这个比上一篇整合更费时,原因在于自己不太熟悉MyBatis了,下午的时候恶补了一下,看了一下相关的文档和PDF电子书,知识真的是你不用就会忘记的,以后还是不能懈怠 ...
- 【转】如果有人让你推荐Python技术书,请让他看这个列表
入门级 <Head First Python>+ 入门级 + 微信49票 + 豆瓣评分 9.5 推荐语: 66:浅显易懂,编排的顺序特别,有大量插图.对话,不感觉枯燥 古心:通熟易懂,配有 ...
- 看懂Qt源代码-Qt源码的对象数据存储
第一次看Qt源代码的人都会被其代码所迷惑,经常会看到代码中的d_ptr成员.d_func(函数)和Q_DECLARE_PRIVATE等奇怪的宏,总是让人一头雾水,下面这篇文章转自http://www. ...
- 第一次用THINKPHP 报路径错
我第一次 看网上写的代码 define('THINK_PATH','ThinkPHP');define('App_NAME','43');define('App_PATH','.'); require ...
- 面试官:你看过Redis数据结构底层实现吗?
面试中,redis也是很受面试官亲睐的一部分.我向在这里讲的是redis的底层数据结构,而不是你理解的五大数据结构.你有没有想过redis底层是怎样的数据结构呢,他们和我们java中的HashMap. ...
随机推荐
- 解决uploadify插件不同浏览器下的兼容性问题
http://www.thinkphp.cn/code/2138.html uploadify在部分浏览器上没法使用,或者各种报错的解决方法.uploadify插件上传图片是很爽的体验. 如果用chr ...
- 自定义View系列教程04--Draw源码分析及其实践
深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...
- 「BZOJ2510」弱题
「BZOJ2510」弱题 这题的dp式子应该挺好写的,我是不会告诉你我开始写错了的,设f[i][j]为操作前i次,取到j小球的期望个数(第一维这么大显然不可做),那么 f[i][j]=f[i-1][j ...
- Android教程 -09 数据的持久化存储
视频为本篇播客知识点讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷 任何一个程序其实说白了就是在不停地和数据打交道,数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证及时手机关机的情况下 ...
- mysql format时间格式化说明
原文地址为:mysql format时间格式化说明 date_format(datetime,formatting)可以格式日期和时间(例如 YYYY-MM-DD HH:MM:SS)和(HH:MM:S ...
- H3C 命令行历史记录功能
- 高级PHP开发:利用PHPEMS搭建在线考试平台
今天给大家分享一个小技巧,就是利用PHP ems搭建在线考试平台:希望能给你给予帮助: 在给大家分享之前,这里推荐下我自己建的PHP开发-VIP资料出售平台 :638965404,不管你是小白还是大牛 ...
- SuperSocket从服务器端主动发起连接
你可以从服务器端主动连接客户端, 连接建立之后的网络通信处理将和客户端主动建立连接的处理方式一样. var activeConnector = appServer as IActiveConnecto ...
- Python--day27--几个内置方法:__repr__()/__str__()/__del__()/__call__()/__getitem__/__setitem/delitem/__new__/__eq__/__hash__
repr方法() 双下方法__str__: 打印对象就相当于打印对象.__str__ __repr__(): __repr__是__str__的备胎,没有__str__的时候,就调用__repr__: ...
- Java中方法的格式
[修饰符] 返回值类型 方法名([参数类型 形式参数1,参数类型 形式参数2,……]) { 执行语句; [return 返回值;]//需要的话 } 参数列表(参数的类型 ...