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.移动设备三轴加速度计的坐标系是右手坐标系。
以上。