COCOS学习笔记--重力感应Acceleration

Cocos2dx重力感应Acceleration,准确来说叫加速度计,加速度计可以感应设备上XYZ轴方向上线性加速度的变化。其实叫“重力感应”或“重力加速度计”都不如“加速度计”准确,因为作用于三个轴上的加速度是指所有加速度的总和,包括了由重力产生的加速度和用户移动设备产生的加速度。在设备静止的情况下,这时候的加速度就只是重力加速度。这里为了直观我还是喜欢叫它重力感应哈哈。在游戏开发中有时会用到这一功能,比如赛车游戏倾斜屏幕时转弯就用到了重力感应。

和触摸事件事件一样 重力感应的处理是由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) {}
};

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

 我们在这之前先建一个带有tegsprite

#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等设备三轴加速度计的坐标系是右手坐标系,如图:

COCOS学习笔记--重力感应Acceleration_第1张图片 

总结一下:

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

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

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

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

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

 

 

以上。 


 

你可能感兴趣的:(cocos2d-x,重力感应,加速度计,onAcceleration)