[寒江孤叶丶的Cocos2d-x之旅_11]Cocos2d-x的重力感应Demo。如何使用重力感应。

来源:互联网 发布:2017网络电影 编辑:程序博客网 时间:2024/05/22 02:18

    在开发一些赛车类,或者躲避类的游戏中,经常会用到重力感应的功能。比如以前玩儿的控制一个金属球走迷宫的游戏。

    在最近这个版本的TestCPP中我没有找到关于重力感应的例程,不知道是官方没有添加还是我自己没找到。不管如何吧,我通过网上搜索资料。解决了自己所遇到的问题。在此分享出来希望对大家有用。

    一下内容是自己的理解,不对之处欢迎指出!

首先先看一张图,这事一个XYZ轴的三维坐标图,通过XYZ轴指向的方向来获得一个-1到1的系数,来分辨出当前手机的姿势。  X是横轴 Y是纵轴,而Z则是一个穿过屏幕的法线。

如果箭头指向水平方向,是0,指向上方则是-1  而下方则是1,如图,YX 都为0   而Z 则是-1,如果这时,将Y轴往上翘起,Y会由0 慢慢的转化为-1  如果将X轴向下倾斜,则X会由0  变为1。

使用方法:

在init方法中,添加初始化的代码:

    //开启重力感应    Device::setAccelerometerEnabled(true);    //设置监听的回调方法    auto listener = EventListenerAcceleration::create(CC_CALLBACK_2(HelloWorld::onAcceleration,  this));    //获取时间分发期,并向时间分发器添加监听时间    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);    //创建一个用于测试的Sprite    auto spTest = Sprite::create("CloseNormal.png");    spTest->setPosition(Vec2(Director::getInstance()->getVisibleSize().width/2, Director::getInstance()->getVisibleSize().height/2));    this->addChild(spTest);    spTest->setTag(1000);
在头文件中添加一行成员函数的声明:(这里直接添加到HelloWorld类中了)

    void onAcceleration(cocos2d::Acceleration* acc, Event* unused_event);
最后将方法实现:

void HelloWorld::onAcceleration(Acceleration* acc, Event* unused_event){    //获取导演类对象    auto dirInstance = Director::getInstance();    //获取之前创建的Sprite    auto spTest=this->getChildByTag(1000);    //通过导演类中的方法,将Sprite的屏幕坐标转换为UIkit的坐标    auto uiSpPoint = dirInstance->convertToUI(spTest->getPosition());    //并将中里感应的数值乘上中里系数    uiSpPoint.x += acc->x * 9.81f;    uiSpPoint.y -= acc->y * 9.81f;    //将计算后的UIkit坐标转换回屏幕中的坐标    auto spNewPoint = dirInstance->convertToGL(uiSpPoint);    spTest->setPosition(spNewPoint);}





0 0
原创粉丝点击