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.移動設備三軸加速度計的座標系是右手座標系。
以上。