初学cocos2dx(3.1.1),希望在看demo的同时能够留下痕迹,按照字母顺序。
Acceleration 加速计,也叫重力计,如图所示。
Acceleration类
class Acceleration { public: double x; double y; double z; double timestamp; /*x,y,z应该是如图所示的分量,timestamp是什么未知,待等会儿移植到安卓上再研究*/ Acceleration(): x(0), y(0), z(0), timestamp(0) {} };
test中的onEnd(),主要是设置了一个小球精灵以及对加速计绑定 监听,然后改变小球位置。
void AccelerometerTest::onEnter() { Layer::onEnter(); //设置设备的加速度传感器可用 Device::setAccelerometerEnabled(true); //加入监听,回调onAcceleration() auto listener = EventListenerAcceleration::create(CC_CALLBACK_2(AccelerometerTest::onAcceleration, this)); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); auto label = Label::createWithTTF(title().c_str(), "fonts/arial.ttf", 32.0f); addChild(label, 1); label->setPosition( Vec2(VisibleRect::center().x, VisibleRect::top().y-50) ); _ball = Sprite::create("Images/ball.png"); _ball->setPosition(Vec2(VisibleRect::center().x, VisibleRect::center().y)); addChild(_ball); _ball->retain(); }
回调的onAcceleration()
void AccelerometerTest::onAcceleration(Acceleration* acc, Event* event) { /*FIXME: Testing on the Nexus S sometimes _ball is NULL */ if ( _ball == nullptr ) { return; } auto ballSize = _ball->getContentSize(); auto pos = _ball->getPosition(); CCLog("acc:(x,y)--->(%f,%f)",acc->x,acc->x); //现在还不知道为什么要把坐标*重力的值 pos.x += acc->x * 9.81f; pos.y += acc->y * 9.81f; //修订坐标在某个区间范围内 FIX_POS(pos.x, (VisibleRect::left().x+ballSize.width / 2.0), (VisibleRect::right().x - ballSize.width / 2.0)); FIX_POS(pos.y, (VisibleRect::bottom().y+ballSize.height / 2.0), (VisibleRect::top().y - ballSize.height / 2.0)); _ball->setPosition(pos); }