cocos2D-x 3.x学习笔记【二】 事件机制入门
来源:互联网 发布:淘宝小也旗舰店靠谱吗 编辑:程序博客网 时间:2024/05/22 01:29
本博文基于以下环境:
Cocos2D-x v3.2
vc++ 2012
win7
=============================正文开始=====================================
- 触摸事件 (EventListenerTouch)
- 键盘响应事件 (EventListenerKeyboard)
- 鼠标响应事件 (EventListenerMouse)
- 自定义事件 (EventListenerCustom)
- 加速记录事件 (EventListenerAcceleration)
_eventDispatcher
的工作由三部分组成:
- 事件分发器 EventDispatcher
- 事件类型 EventTouch, EventKeyboard 等
- 事件监听器 EventListenerTouch, EventListenerKeyboard 等。
auto sprite1 = Sprite::create("about.png");//创建精灵1,随意放入图片 sprite1->setAnchorPoint(Vec2(0.5,0.5)); sprite1->setPosition(Vec2(origin.x + visibleSize.width/2 , origin.y +150 )); this->addChild(sprite1); auto listener1 = EventListenerTouchOneByOne::create();//获取 单点触碰 事件监听器。 listener1->setSwallowTouches(false);// 设置是否为吞没事件,在 onTouchBegan 方法返回 true 时吞没,其他节点将不会被触发事件 listener1->onTouchBegan = [](Touch* touch , Event* event ) { auto target = static_cast<Sprite*>(event->getCurrentTarget()); //获取当前的节点,即注册了该事件的节点。 Vec2 locationInNode = target->convertToNodeSpace(touch->getLocation());//相对于 当前节点左下角原点 的触碰坐标,x y可能为负 Size s = target->getContentSize(); Rect rect = Rect(0, 0, s.width, s.height); if (rect.containsPoint(locationInNode)) // 判断触碰坐标是否在目标节点范围内 { log("sprite began... x = %f, y = %f", locationInNode.x, locationInNode.y); target->setOpacity(180); // 设置目标节点透明度为 180,满值255. return true; } return false; };//添加触碰结束逻辑函数 listener1->onTouchEnded = [](Touch* touch , Event* event) { log( "sprite1 is on touch ended "); }; listener1->onTouchMoved = [](Touch* touch , Event* event ) { log( "sprite1 is on touch moved" ); }; auto listener2 = EventListenerTouchOneByOne::create(); listener2->onTouchBegan = [](Touch* touch , Event* event ) { log("layer is on touch"); return true; }; listener2->onTouchMoved = [](Touch* touch , Event* event ) { log("layer is on touch move" ); }; listener2 -> onTouchEnded = [](Touch* touch , Event* event ) { log( "layer is on touch end "); }; _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1 , sprite1 );//给sprite1注册监听 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener2 ,this );//给当前层注册监听,sprite1为该层的子节点这些方法我调用了log,可以在调试的时候看一下控制台输出。
第五点: 点击判断是分离的。一般意义上的点击,是按下手指和松开手指为一个完整的流程。事件机制里分别对应两个逻辑函数,onTouchBegan 和 onTouchEnded。所以想要对点击作一个监听的话,把点击逻辑放在在onTouchBegan里是有错漏的,也许用户是误点按钮,他会在按下以后手指划出按钮范围以避免发生点击(我想很多人都这么做过),故而点击逻辑应该写在 ended里面。
我们可以通过以下方法移除一个已经被添加了的监听器。
_eventDispatcher->removeEventListener(listener);
也可以使用如下方法,移除当前事件分发器中所有监听器。
_eventDispatcher->removeAllEventListeners();
当使用removeAll的时候,此节点的所有的监听将被移除,推荐使用 指定删除的方式。removeAll之后菜单也不能响应。因为它也需要接受触摸事件。
建议:当想为某一个特定的 sprite 设置触碰事件监听的时候(比如当做按钮),应当将事件监听器的setSwallowTouches方法设定为true,并在此事件监听器的 onTouchBegan 方法中,对触碰范围进行判断,如果在该 sprite 的范围内,则返回true。这样的话,事件分发器将不再对其他的事件监听器进行分发操作,即优化了效率,也提高了操作的安全性。
完毕,关于键盘、鼠标以及加速记录事件可以查看官方资料。
明天研究将研究 事件优先级 和 自定义事件。
以上是今天研究所得,有所缺漏,望能指正。
- cocos2D-x 3.x学习笔记【二】 事件机制入门
- Cocos2d-x事件分发机制学习笔记
- Cocos2d-x 3.x 事件分发机制
- Cocos2d-x 3.X 事件分发机制
- Cocos2d-x 3.X 事件分发机制
- Cocos2d-x 3.X 事件分发机制
- Cocos2d-x 3.X 事件分发机制
- Cocos2d-x 3.X 事件分发机制
- Cocos2d-x v3.2笔记——Cocos2d-x 3.x新事件分发机制总结
- Cocos2d-x学习笔记(九)-------->Touch事件处理机制
- cocos2d-x学习笔记——EventDispatcher事件分发机制
- Cocos2d-x学习笔记—事件处理机制
- cocos2d-x-3.0学习笔记之用户事件机制
- cocos2d-x 3.x学习笔记<二> 打包apk
- cocos2d-x-3.1 事件分发机制 (coco2d-x 学习笔记七)
- cocos2d-x入门笔记(二)
- Cocos2d-x学习笔记(二)Cocos2d-x整体框架
- cocos2d-x 3.x学习笔记<一>
- 程序员生存定律-打造属于自己的稀缺性
- python学习-匿名函数
- A. Eevee
- SGU 259 单机调度问题 +贪心 及此题解法的证明
- python学习-装饰器
- cocos2D-x 3.x学习笔记【二】 事件机制入门
- zzm
- 碰到一例磁盘不释放的问题
- python学习-装饰器问答
- note_20140802_FLOPS_Memory_hierarchy
- PHP不生成文件进行实时下载
- http://objccn.io/
- Vim
- No route to host 之 SSH