cocos2d-x 3.0 事件分发机制
在cocos2d-x 3.0中一共有五个事件监听器:
- 触摸事件(EventListenerTouch)
- 键盘响应事件 (EventListenerKeyboard)
- 加速器记录事件(EventListenerAcceleration)
- 鼠标响应事件(EventListenerMouse)
- 自定义事件(EventListenerCustom)
顾名思义,就是分别监听touch,key、加速器、mouse和自定义的事情。
对于加速器记录事件,现在基本上没有接触到这方面,就先略过吧。。。
触摸事件:
给一个精灵加一个触摸事件:
auto sprite1 = Sprite::create("Images/1.png");
sprite2->setPosition(origin+Vec2(size.width/, size.height/));
addChild(sprite2, ); //创建一个单点触摸事件
auto listener1 = EventListenerTouchOneByOne::create();
listener1->setSwallowTouches(true); //实现touchBegin方法
listener1->onTouchBegan = [](Touch* touch, Event* event){
return true;
}; listener1->onTouchMoved = [](Touch* touch, Event* event){ }; listener1->onTouchEnded = [](Touch* touch, Event* event){ }; //添加事件
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, sprite1);
这里touch方法的写法用到了lambda,不熟悉的可以自己去看一下。。。
添加事件的方法有两个,一个是addEventListenerWithSceneGraphPriority(此时时间分派的优先级根据精灵在界面上的显示优先级来的,即在界面上前面的精灵先响应,后面的精灵后响应),一个addEventListenerWithFixedPriority(此时是传入优先级参数给函数,优先级数字越小优先级越大)。
当我们需要再次使用listener的时候,需要使用clone()方法创建一个新的克隆,因为在使用因为在使用 addEventListenerWithSceneGraphPriority
或者 addEventListenerWithFixedPriority
方法时,会对当前使用的事件监听器添加一个已注册的标记,这使得它不能够被添加多次。另外,有一点非常重要,FixedPriority listener添加完之后需要手动remove,而SceneGraphPriority listener是跟node绑定的,在node的析构函数中会被移除。
键盘响应事件
对于键盘响应事件,先上代码:
auto listener = EventListenerKeyboard::create();
listener->onKeyPressed = [](EventKeyboard::KeyCode keyCode, Event* event){
char buf[] = {};
sprintf(buf, "Key %d was pressed!", (int)keyCode);
auto label = static_cast<Label*>(event->getCurrentTarget());
label->setString(buf);
}; listener->onKeyReleased = [](EventKeyboard::KeyCode keyCode, Event* event){
char buf[] = {};
sprintf(buf, "Key %d was released!", (int)keyCode);
auto label = static_cast<Label*>(event->getCurrentTarget());
label->setString(buf);
}; _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, statusLabel);
这里主要有两个方法,一个响应键盘按下,一个响应键盘松开,以后安卓机器写双击退出游戏,直接用这个就好了。。。
自定义事件
这个是最重要的了,所谓自定义事件就是人为定义的一些事件,不是由系统来触发的,代码如下:
_listener = EventListenerCustom::create("game_custom_event1", [=](EventCustom* event){
std::string str("Custom event 1 received, ");
char* buf = static_cast<char*>(event->getUserData());
str += buf;
str += " times";
statusLabel->setString(str.c_str());
}); _eventDispatcher->addEventListenerWithFixedPriority(_listener, );
很简单,写个事件名称和事件响应函数就好了,那么自定义事件是怎么触发的呢?
_eventDispatcher->dispatchEvent(&event);
直接在需要触发的地方dispatch一下就好了。。。
挺简单的,但是很多地方都可以用到的。
我这里只是简单地记了一下,test里的NewEventDispatcherTest例子里面写得很清楚,最好自己去看一下。。。
cocos2d-x 3.0 事件分发机制的更多相关文章
- Cocos2d-x 3.2 学习笔记(九)EventDispatcher事件分发机制
EventDispatcher事件分发机制先创建事件,注册到事件管理中心_eventDispatcher,通过发布事件得到响应进行回调,完成事件流. 有五种不同的事件机制:EventListenerT ...
- cocos2d-x游戏引擎核心(3.x)----事件分发机制之事件从(android,ios,desktop)系统传到cocos2dx的过程浅析
(一) Android平台下: cocos2dx 版本3.2,先导入一个android工程,然后看下AndroidManifest.xml <application android:label= ...
- Cocos2d-X研究之v3.x 事件分发机制具体解释
事件分发机制 " src="http://www.cgzhw.com/wp-content/uploads/2014/07/inherent3.png" style=&q ...
- Android事件分发机制浅谈(二)--源码分析(ViewGroup篇)
上节我们大致了解了事件分发机制的内容,大概流程,这一节来分析下事件分发的源代码. 我们先来分析ViewGroup中dispatchTouchEvent()中的源码 public boolean dis ...
- android 事件分发机制
1.View的事件分发机制 一个button,简单一点就是onTouch,还有onclick事件,我们一个一个来分析 首先响应的是dispatchTouchEvent public boolean d ...
- Android View 事件分发机制 源码解析 (上)
一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个My ...
- Android事件分发机制(下)
这篇文章继续讨论Android事件分发机制,首先我们来探讨一下,什么是ViewGroup?它和普通的View有什么区别? 顾名思义,ViewGroup就是一组View的集合,它包含很多的子View和子 ...
- Android事件分发机制(上)
Android事件分发机制这个问题不止一个人问过我,每次我的回答都显得模拟两可,是因为自己一直对这个没有很好的理解,趁现在比较闲对这个做一点总结 举个例子: 你当前有一个非常简单的项目,只有一个Act ...
- cocos基础教程(11)事件分发机制
cocos3.0的事件分发机制: 创建一个事件监听器-用来实现各种触发后的逻辑. 事件监听器添加到事件分发器_eventDispatcher,所有事件监听器有这个分发器统一管理. 事件监听器有以下几种 ...
随机推荐
- ORM框架通过映射(反射)获取数据库的数据
ORM(Object Relational Mapping)框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中.只要提供了持久化类与表的映射关系,ORM ...
- 2017年1月1日 java学习第二天复习
今天是新年的第一天,以前学习没有总结习惯,学习效率和成果都很不好. 学习的过程就是反复的复习和不断学习的过程,开始今天的学习总结 学习java的第二天. 今天学习了java最基础的一些内容,照着 ...
- Centos 与本地终端 上传、下载 文件
首先安装lrzsz # yum -y install lrzsz 1.上传文件,执行命令rz,会跳出文件选择窗口,选择好文件,点击确认即可. # rz 运行rz命令后弹出选择文件窗口,找到要上传的文件 ...
- javascript中运算符的优先级
运算符优先级 JavaScript中的运算符优先级是一套规则.该规则在计算表达式时控制运算符执行的顺序.具有较高优先级的运算符先于较低优先级的运算符执行.例如,乘法的执行先于加法. 下表按从最高到最低 ...
- ant学习简单例子
1.下载ant,http://ant.apache.org/ 这个网站下载,然后配置环境变量 打开dos界面,输入ant -version,如果提示命令不存在,进入到ant包装目录bin下载,再次运行 ...
- 引用、引用和术语定义<abbr><acronym><address><bdo><blockquote><q><cite><dfn>
<abbr>-缩写 <acronym>-首字母缩写 <address>-地址 <bdo>-文字方向 <blockquote>-长的引用 & ...
- Jmeter性能测试入门(链接收藏)
Jmeter性能测试入门: http://www.cnblogs.com/TankXiao/p/4045439.html
- 错误 java.lang.ClassCastException: com.ylpw.sms.YZZYSenderUtil cannot be cast to ResourceBundle
出现错误: java.lang.ClassCastException: com.ylpw.sms.YZZYSenderUtil cannot be cast to ResourceBundle 百度搜 ...
- Shell Script (2) - global.sh
cd web/ui npm run e2e-dev -- -i 1 "should be able to add function with argument to a ingredient ...
- 在Oracle中使用Entity Framework 6 CodeFirst
项目中需要将系统从SQLServer数据库迁移到Oracle上.由于原大部分数据访问操作都是通过包装了Entity Framework的统一访问入口实现的,所以需要研究Entity Framework ...