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,所有事件监听器有这个分发器统一管理. 事件监听器有以下几种 ...
随机推荐
- python3 三级菜单
python版本3.5 功能: 1.程序执行显示一级菜单,输入内容进入二级菜单: 2.进入二级菜单后,输入二级菜单内容,进入三级菜单:输入b返回一级菜单: 3.进入三级菜单后,输入b返回二级菜单. # ...
- markdown小记
一直听说用markdown写文档比较符合程序员的逼格,没事就倒腾了下,附上近期整理的精华,留自己以方便查阅. 1.常用指令 单个回车 视为空格. 连续回车 才能分段. 行尾加两个空格,这里-> ...
- python——赋值与深浅拷贝
初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...
- VS2010 验证时出错。HRESULT = '8000000A'
验证时出错.HRESULT = '8000000A' 在VS2010中,当为Windows窗体应用程序添加一个安装项目后,如果项目生成时出现以下错误: 验证时发生错误.HRESULT = '80000 ...
- 张艾迪(创始人):Be.Time+Cr.Idear的创新理念
The World No.1 Girl :Eidyzhang The World No.1 Internet Girl :Eidyzhang AOOOiA.global Founder :Eidyzh ...
- CentOS下 MySQL5.7 详细的部署安装流程
MySQL5.7.14安装过程: 下载5.7版本:wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.14-linux-glibc2 ...
- 用PHP解析类JSON字符串为数组的实现
题目:把字符串嵌套关系转换成数组,字符串只包含成对中括号.数字和逗号字符串:(1,(1,2,(1,(1,2,(1)),3)),3,(1,(1,2,((1((1,(1,2,(1,2,3),4,5),3) ...
- Android开发--Adapter的应用
1.简介 Adapter的作用是为GridView,ListView等界面控件与数据之间搭建桥梁,每当列表里的每一项显示到页面时,都会调用到Adapter的getView方法 返回一个View.在An ...
- Scala 的确棒
我的确认为计算机学院应该开一门 Scala 的语言课程. 在这篇文章中,我会讲述为什么我会有这样的想法,在此之前,有几点我想要先声明一下: 本文无意对编程语言进行评比,我要讲述的主体是为什么你应该学习 ...
- FT部署图