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