前几篇感觉自己在写教育文章,╮(╯▽╰)╭。今天换成开发者的口吻,毕竟我也是在边学边写博客。

处理用户交互包括:单点触摸、多点触摸、事件传递、传感器、物理按键等部分。

单点触摸:

触摸事件传递顺序

onTouchBegan——>onTouchMoved——>onTouchEnded。还有一个onTouchCancelled。

这些事件的监听都是闭包函数(匿名函数,lambda表达式),

[](Touch *t, Event *e){

    //return false;//只有onTouchBegan需要返回bool值
}

如果事件的onTouchBegan监听返回false,则触摸事件不会向后传递。

添加事件监听有3个步骤:1、创建事件监听对象指针;2、实现触摸事件监听;3、分发触摸事件监听

下面是一个示例,我在控制台打印输出3个事件名称。

bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if (!Layer::init())
{
return false;
} Size size = Director::getInstance()->getVisibleSize(); LabelTTF *label = LabelTTF::create("Click me", "Courier", );
label->setPosition(size.width / , size.height/);
addChild(label); //一次只能监听到一个触摸点
EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = [](Touch *t, Event *e){
/*if (e->getCurrentTarget()->getBoundingBox().containsPoint(t->getLocation())){
log("onTouchBean");
return true;
}*/
/*if (label->getBoundingBox().containsPoint(t->getLocation())){
log("onTouchBegan");
return true;
}*/
log("onTouchBegan");
return true;
};
listener->onTouchMoved = [](Touch *t, Event *e){
log("onTouchMoved");
};
listener->onTouchEnded = [](Touch *t, Event *e){
log("onTouchEnded");
};
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, label);
return true;
}

运行效果中,我先用鼠标左键点击了一下窗体界面,控制台输出onTouchBegan,然后松开鼠标左键,控制台输出onTouchEnded;重复一次;然后点击之后移动,控制台不停输出onTouchMoved,然后松开,控制台输出onTouchEnded。

运行效果:

多点触摸:

多点触摸的事件监听变成了onTouchesBegan, onTouchesMoved, onTouchesEnded。还有一个onTouchesCancelled。

事件监听的闭包函数:

[](std::vector<Touch*> ts, Event *e){
//只有onTouchesBegan需要返回bool值
}

这个测试的话要用真机。

举个栗子:

监听当前层的触摸事件,手指触摸手机屏幕并移动的时候,控制台输出触摸点的个数。

代码如下:

bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if (!Layer::init())
{
return false;
} Size size = Director::getInstance()->getVisibleSize(); //监听多点触摸事件
auto listener = EventListenerTouchAllAtOnce::create();
listener->onTouchesBegan = [](std::vector<Touch*> *ts, Event *e){
log("onTouchesBegan");
};
listener->onTouchesMoved = [](std::vector<Touch*> ts, Event *e){
log("touches moved, and touch count is %d", ts.size());
};
//监听当前的层
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
return true;
}

运行效果:

算了,不运行了。(⊙o⊙)…

等我写一篇把windows平台的代码编译到Android平台的流程再说。

传感器:

这里介绍加速度传感器的调用。

关键代码:

bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if (!Layer::init())
{
return false;
} Device::setAccelerometerEnabled(true);//开启加速器 auto listener = EventListenerAcceleration::create([](Acceleration* a, Event *e){
//%g是自动选择%f和%e中总位数最短的来表示浮点数,%f是浮点数形式,%e是指数形式
//x, y, z是double类型
log("x:%g, y:%g, z:%g", a->x, a->y, a->z);
}); Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
return true;
}

这个需要真机运行才能看到效果,意味着需要编译到Android、ios或wp平台。后面我会写一篇编译并运行到Android真机的博客。

物理按键交互:

这里的代码示意的是Android平台的返回键的监听:

bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if (!Layer::init())
{
return false;
} auto listener = EventListenerKeyboard::create();
listener->onKeyReleased = [](EventKeyboard::KeyCode keyCode, Event *e){
log("key code : %d", keyCode);
switch (keyCode)
{
//listen in the back key in Android Devices
case EventKeyboard::KeyCode::KEY_BACKSPACE:
Director::getInstance()->end();
break;
}
}; return true;
}

还是需要用真机测试。

五毛的cocos2d-x学习笔记06-处理用户交互的更多相关文章

  1. Bash脚本编程学习笔记05:用户交互与脚本调试

    用户交互 在<学习笔记04>中我们有提到位置参数,位置参数是用来向脚本传递参数的一种方式.还有一种方式,是read命令. [root@c7-server ~]# read name alo ...

  2. Linux学习笔记06—系统用户及用户组的管理

    一.认识/etc/passwd和/etc/shadow 1./etc/passwd 由 ‘:’ 分割成7个字段,每个字段的具体含义是: 用户名 存放账号的口令:现在存放在/etc/shadow下,在这 ...

  3. 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记

    机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习作者:米仓山下时间: ...

  4. iOS学习笔记06—Category和Extension

    iOS学习笔记06—Category和Extension 一.概述 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inher ...

  5. springmvc学习笔记(18)-json数据交互

    springmvc学习笔记(18)-json数据交互 标签: springmvc springmvc学习笔记18-json数据交互 springmvc进行json交互 环境准备 加入json转换的依赖 ...

  6. [Golang学习笔记] 06 程序实体3 类型断言和类型转换

    类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...

  7. stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)

    STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启 ...

  8. [原创]java WEB学习笔记06:ServletContext接口

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. Bash脚本编程学习笔记06:条件结构体

    简介 在bash脚本编程中,条件结构体使用if语句和case语句两种句式. if语句 单分支if语句 if TEST; then CMD fi TEST:条件判断,多数情况下可使用test命令来实现, ...

随机推荐

  1. WISPr1.0

    王桢珍 王兵 侯志强 苑红 中国移动研究院 网络技术研究所, 北京100053 摘要   本文详细介绍了WLAN国际漫游的WISPr1.0技术规范并探讨其具体实现,包括基于WISPr1.0的WLAN国 ...

  2. genymotion 模拟器 真是牛叉了 速度超快啊!!! 不解释了!建议大家速度去体验一把吧!

    已经有人写了blog了 我就不再赘述了,详情去这里看去吧!!   android genymotion模拟器怎么使用以及和google提供的模拟器性能对比  http://blog.csdn.net/ ...

  3. eclipse 修改编码

    在Eclipse的开发使用中,我们经常使用的是UTF-8,但是刚刚安装的或者是导入的项目是其他编码的默认是GBK的,这就造成我们的项目乱码,一些中文解析无法查看,对我们的开发造成不便. 工具/原料 E ...

  4. oracle 11g常用命令

    1.监听启动监听lsnrctl start停止监听 lsnrctl stop 查看监听状态 lsnrctl status 2.启动用oracle用户进入su - oracle运行sqlplus命令,进 ...

  5. Ajax或JS动态添加的元素,Jquery效果不起作用

    问题: 最近在做一个Ajax分页的功能,遇到一个问题 一开始jquery效果是可用的,但是,ajax执行一次之后,jquery效果就无效了. 解决办法: 可以添加live事件来解决 W3C关于live ...

  6. AlarmManager类的应用(实现闹钟功能)

    1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ...

  7. android listview 重用view导致的选择混乱问题

    20150526 listview是常用的控件,经常用自定义的adapter,为了提高显示效率,常利用view的重用方式防止重绘,但因为重用利用的是旧的view,常导致显示的数据会由于position ...

  8. iOS7 NavigationController 右滑手势问题

    苹果一直都在人机交互中尽力做到极致,在iOS7中,新增加了一个小小的功能,也就是这个api:self.navigationController.interactivePopGestureRecogni ...

  9. mssql字符串分割后的值,把表中不存在的插入表中

    字符串分割后的值,把表中不存在的插入表中 --供大家参考 使用场景,自行思考…… --创建表tb1 Create table tb1 ( cola int, colb ) ) --插入数据 inser ...

  10. Django web开发【5】 实现标签功能

    标签tag在很多web2.0应用中都很常见,标签其实就是关联某些信息的一个关键字.打标签实际上就是给内容分配标签的过程,它通常由作者或者用户实现.标签之所有这么流行是因为它允许用户对自己创建的博客.图 ...