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

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

单点触摸:

触摸事件传递顺序

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. sim卡中短信简要格式

    //SELECT A0 A4 00 00 02 3F 00 9F 17 //A0 A4 00 00 02 是命令头,CLA = A0表示GSM应用,INS = A4 表示SELECT,P1 P2 =  ...

  2. spring的作用及优势---第一个spring示例

    Spring 的作用及优势  * Spring 用于整合,好处是解耦. 解耦,可以降低组件不组件乊间的关联,改善程序结构,便于系统的维护和扩展. 我们在使用 Spring 框架时,主要是使用 Spri ...

  3. ora-01031:insufficient privileges 解决方案

    sqlplus /as sysdba 连补上,ora-01031的解决方法: (1)检查sqlnet.ora是否包含这句话:SQLNET.AUTHENTICATION_SERVICES=(NTS),没 ...

  4. mysql 权限控制具体解释

    概述 mysql权限控制在不同的上下文和不同的操作水平上都能够进行控制,他们包括例如以下几个 ** 管理权限能够同意用户管理mysql server的操作. 这些权限控制是全局的,不是针对某个特定的数 ...

  5. web - 清除浮动

    最理想的方式为 伪类 + content : 例如 div:after{content:"";display:block;clear:both;} div{zoom:1;} 另外, ...

  6. win7+cygwin+hadoop+eclipse

    1.Cygwin : Net    下的:openssh,openssl Base  下的:sed (若需要Eclipse,必须sed)默认即可 Devel 下的:subversion(建议安装) 2 ...

  7. php fpm start.sh

    #! /bin/bash #Source function library. . /etc/init.d/functions #Check that networking is up. . /etc/ ...

  8. <转>四个重要属性——Action、Data、Category、Extras

    Intent作为联系各Activity之间的纽带,其作用并不仅仅只限于简单的数据传递.通过其自带的属性,其实可以方便的完成很多较为复杂的操作.例如直接调用拨号功能.直接自动调用合适的程序打开不同类型的 ...

  9. Excel VLOOKUP等使用记录

    1.LEFT 函数:LEFT(G2,ROW(INDIRECT("76:"&LEN(G2)))) 截取G2单元格从开头,SIZE=76的部分字符串 2.RIGHT 函数:RI ...

  10. codeforces 632C. The Smallest String Concatenation 排序

    题目链接 给出n个字符串, 将他们连在一起, 求连玩之后字典序最小的那种情况. 按a+b<b+a排序.... #include <iostream> #include <vec ...