`
810364804
  • 浏览: 782661 次
文章分类
社区版块
存档分类
最新评论

【Cocos2d-X开发学习笔记】第24期:事件处理机制之加速度传感器事件

 
阅读更多

本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010

智能手机的游戏与应用中,也经常会用到加速传感器事件来丰富用户的操作,比如赛车游戏中摇动手机控制前进

方向、动作过关游戏中通过加速度传感器来控制角色的移动和跳跃方向等。那么这一期,我们就来学习一下如何使用

加速度传感器事件。

一、加速度传感器事件

Cocos2D-X中使用加速度传感器代理CCAccelerometerDelegate提供的方法来接受加速度传感器的数值变化,继承

系如下图所示。

布景层类CCLayer和其子类继承自CCAccelerometerDelegate类,因此布景层类和其子类可以使用获得加速度传感

器的方法。

二、CCAccelerometerDelegate类的函数

CCAccelerometerDelegate类的公共函数见下图。

didAccelerate函数传入CCAcceleration结构体,其中的数据见下图。

CCAcceleration结构体存储了加速度传感器的数据,包括时间戳和坐标轴上的加速度值,这个值以重力加速度为

单位,因此,要获得相应坐标轴加速度的值时,需要乘上重力加速度g。见如下代码所示。

ptTemp.x += pAccelerationValue->x * 9.81f;
    ptTemp.y -= pAccelerationValue->y * 9.81f;


三、加速度传感器事件使用实例

要在CCLayer中获得加速度传感器事件的数据,首先要在初始化函数中加入允许接受加速度传感器事件的函数。

1、首先新建Cocos2D-X项目,取名为“MyKeypad”,然后在HelloWorldScene.h文件中声明如下成员函数和变量。

class HelloWorld : public cocos2d::CCLayer
{
protected:
    cocos2d::CCSprite* m_pBall;   

public:
    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    virtual bool init();  

    // there's no 'id' in cpp, so we recommand to return the exactly class pointer
    static cocos2d::CCScene* scene();
    
    virtual void didAccelerate(cocos2d::CCAcceleration* pAccelerationValue);

    // implement the "static node()" method manually
    CREATE_FUNC(HelloWorld);
};


2、在HelloWorldScene.cpp文件中的init函数中添加如下所示代码。

bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {
        CC_BREAK_IF(! CCLayer::init());

        setAccelerometerEnabled(true);		

		m_pBall = CCSprite::create("ball.png");
		m_pBall->setPosition(ccp(100, 150));
		addChild(m_pBall);

		m_pBall->retain();

        bRet = true;
    } while (0);

    return bRet;
}

在init函数中加入setAccelerometerEnabled(true),使得加速度事件可以被捕获,然后重写didAccelerate函数。

3、最后在HelloWorldScene.cpp文件中添加如下所示函数。

void HelloWorld::didAccelerate(CCAcceleration* pAccelerationValue)
{
    CCDirector* pDir = CCDirector::sharedDirector();

    /*FIXME: Testing on the Nexus S sometimes m_pBall is NULL */
    if ( m_pBall == NULL ) {
        return;
    }

    CCSize ballSize  = m_pBall->getContentSize();

    CCPoint ptNow  = m_pBall->getPosition();
    CCPoint ptTemp = pDir->convertToUI(ptNow);

    ptTemp.x += pAccelerationValue->x * 9.81f;
    ptTemp.y -= pAccelerationValue->y * 9.81f;

    CCPoint ptNext = pDir->convertToGL(ptTemp);
    FIX_POS(ptNext.x, (10 + ballSize.width / 2.0), (100 - ballSize.width / 2.0));
    FIX_POS(ptNext.y, (50 + ballSize.height / 2.0), (150 - ballSize.height / 2.0));
    m_pBall->setPosition(ptNext);
}

在didAccelerate函数中获得CCAcceleration结构体,获得x轴和y轴的以重力为单位的加速度值,分别乘以重力加速

度值获得相应的加速度。


4、运行实例效果图

源码下载地址

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics