Cocos2dx重力感应Acceleration,准确来说叫加速度计,加速度计能够感应设备上X、Y、Z轴方向上线性加速度的变化。事实上叫“重力感应”或“重力加速度计”都不如“加速度计”准确,由于作用于三个轴上的加速度是指全部加速度的总和,包含了由重力产生的加速度和用户移动设备产生的加速度。在设备精巧的情况下,这时候的加速度就仅仅是重力加速度。这里为了直观我还是喜欢叫它重力感应哈哈。

在游戏开发中有时会用到这一功能,比方赛车游戏倾斜屏幕时转弯就用到了重力感应。

和触摸事件事件一样 重力感应的处理是由cocos引擎提供了接收加速度计事件的回调函数onAcceleration(),也就是说,在实际开发中 仅仅须要重载加速度计事件,当与设备加速度改变的事件发生时会就调用这一方法。我们能够在CCLayer类中看到这一方法:

virtual void onAcceleration(Acceleration* acc, Event* unused_event);

这一方法传入的第一个參数是一个指向Acceleration类型的变量,Acceleration包括重力感应获得的三个方向的加速度,能够在ccType.h中看到这个类:

class CC_DLL Acceleration
: public Ref
{
public:
double x;
double y;
double z;
//timestamp时间戳属性。用来表示事件发生的相对时间
double timestamp; Acceleration(): x(0), y(0), z(0), timestamp(0) {}
};

以下我们就通过一个使用加速度计的样例来学习:

我们在这之前先建一个带有teg的sprite:

#define TAG  10
//创建一个sprite
auto sprite = Sprite::create("haha.jpg");
//加入
this->addChild(sprite);
//设置tag
sprite->setTag(TAG);
//设置坐标
sprite->setPosition(Vec2(480,320));

1.先在头文件里声明该方法:

//加速度计的回调函数声明
virtual void onAcceleration(Acceleration* acc, Event* unused_event);

2.在.cpp文件里开启加速度计,这一步很重要,是必须的,否则不会检測出设备加速度的变化:

setAccelerometerEnabled(true);

3.在.cpp文件里实现加速度计的回调函数:

#define SPEED 20
void HelloWorld::onAcceleration(Acceleration* acc, Event* unused_event)
{
//通过tag获得sprite
Sprite * _sprite = (Sprite*)this->getChildByTag(TAG);
if (_sprite)
{
//获得sprite坐标
Vec2 vec = _sprite->getPosition();
//获得当前x、y轴坐标
float x = vec.x;
float y = vec.y;
//获得移动距离
double disX = acc->x * SPEED;
double disY = acc->y * SPEED;
_sprite->setPosition(Vec2(x+disX,y+disY));
}
}

好了,栗子做完啦,只是我们要打个包在手机上才干检測出重力感应,在电脑上执行是看不出来的。大家能够打包试试,亲測可用哦!

注意,onAcceleration()方法里的參数acc->x、acc->y、acc->z各自是获得x、y、z轴方向上的加速度,单位为g。1g = 9.81 m s?

2。另外,iOS和Android等设备三轴加速度计的坐标系是右手坐标系,如图:

总结一下:

1.Cocos引擎提供了onAcceleration()方法用于接收加速度计事件的回调函数;

2.作用于三个轴上的加速度是指全部加速度的总和,包含了由重力产生的加速度和用户移动设备产生的加速度;

3.使用onAcceleration()方法前要开启加速度计setAccelerometerEnabled(true)。

4.onAcceleration()里的參数acc->x、acc->y、acc->z各自是获得x、y、z轴方向上的加速度,单位为g;

5.移动设备三轴加速度计的坐标系是右手坐标系。

以上。

COCOS学习笔记--重力感应Acceleration的更多相关文章

  1. COCOS学习笔记--Cocod2dx内存管理(三)-Coco2d-x内存执行原理

    通过上两篇博客.我们对Cocos引用计数和Ref类.PoolManager类以及AutoreleasePool类已有所了解,那么接下来就通过举栗子来进一步看看Coco2d-x内存执行原理是如何的. / ...

  2. cocos学习笔记:快速上手

    cc.Class({ //奇怪的语法风格,cc.class, extends: cc.Component, //扩展自cc.Component properties: { //类的属性设置 jumpH ...

  3. COCOS学习笔记--关于使用cocostudio打安卓包

    我在之前的博客里也写到过,如今cocos引擎提供了一键打包.很方便. 今天正好做个測试,想用引擎的一键打包弄个apk的安卓包.以下就简介一下详细过程和自己的一些理解: 先说一下项目背景,因为我的电脑是 ...

  4. COCOS学习笔记--粒子系统

    一.粒子系统的简单介绍 粒子系统是指计算机图形学中模拟特定现象的技术,它在模仿自然现象.物理现象及空间扭曲上具备得天独厚的优势,为我们实现一些真实自然而又带有随机性的特效(如爆炸.烟花.水流)提供了方 ...

  5. COCOS学习笔记--即时动作ActionInstant

    Cocos引擎中的动作类的关系图例如以下: 能够看出,Action是继承自Ref类的,之前我的博客中也有讲过,Ref类是cocos2dx全部类的基类.动作类(Action)是全部动作的基类.它通过cr ...

  6. COCOS学习笔记--Button类及其相关控件属性

    一.Button介绍 Button就是button.Cocos中提供了Button类对button进行相关的操作.我们看一下Button类继承关系图: 能够看到.Button是继承自Widget类,W ...

  7. COCOS学习笔记--持续动作ActionInterval

    上一篇博客介绍了即时动作ActionInstant.与即时动作相对的是持续动作ActionInterval. 顾名思义,持续动作就是须要一段时间来持续运行的动作,而且在有限时间内改变运行对象的一些属性 ...

  8. COCOS学习笔记--单点触控

    这篇博客来总结下cocos单点触控的相关内容: 我们在Layer类的源代码中能够看到.Layer类提供了一下4个与屏幕单点触控相关的回调方法: onTouchBegan().onTouchMoved( ...

  9. COCOS学习笔记--变速动作Speed和ActionEase

    变速动作和复合动作类似.也是一种特殊的动作,它能够把不论什么动作依照改变后的速度运行.变速动作与复合动作最大的差别就是复合动作仅仅是单纯的组合一系列动作,而变速的做在组合一系列动作后还要去改变动作的运 ...

随机推荐

  1. PHP方法之 substr

    简单描述: substr 主要用于字符串的截取,但是不适用于中文字符串,易出现乱码,中文字符串可使用mbstring. 方法申明: substr(string,start,length) string ...

  2. 关于json的dump和dumps

    首先说明基本功能: dumps是将dict转化成str格式,loads是将str转化成dict格式. dump和load也是类似的功能,只是与文件操作结合起来了. 1.把python的数据,转换为js ...

  3. LeetCode(150) Evaluate Reverse Polish Notation

    题目 Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, ...

  4. Repo command reference

    Repo command reference In this document init sync upload diff download forall prune start status Rep ...

  5. myeclipse 改变模版

    一.修改Servlet的默认模板代码 使用MyEclipse创建Servlet时,根据默认的Servlet模板生成的Servlet代码如下: 1 package gacl.servlet.study; ...

  6. go 和make的用法 区别

    Doand Make are two verbs which frequently confuse students of English. Learn the Difference between ...

  7. Linux 文件/文件夹重命名

    mv命令既可以重命名,又可以移动文件或文件夹. 例子:将目录A重命名为Bmv A B 例子:将/a目录移动到/b下,并重命名为cmv /a /b/c 其实在文本模式中要重命名文件或目录,只需要使用mv ...

  8. JS事件兼容性

    事件代理的时候,使用事件对象中的srcElement属性,获取触发元素.IE浏览器支持window.event.srcElement , 而firefox支持window.event.target. ...

  9. HDU——2083找单词(母函数)

    找单词 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...

  10. [图论训练]BZOJ 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路【floyd】

    Description     农夫约翰正驾驶一条小艇在牛勒比海上航行.     海上有N(1≤N≤100)个岛屿,用1到N编号.约翰从1号小岛出发,最后到达N号小岛.一 张藏宝图上说,如果他的路程上 ...