cocos2d-x 菜鸟进阶篇(二) 重力感应

本文没你想象的那么,,复杂。其实就是通过重力感应控制个小球移动而已。

先看头文件:

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"
USING_NS_CC;

class HelloWorld : public cocos2d::CCLayer
{
public:
	HelloWorld(void);
	~HelloWorld(void);

    // 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();
    
    // a selector callback
    void menuCloseCallback(CCObject* pSender);

	 virtual void didAccelerate(CCAcceleration* pAccelerationValue);

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

protected:
    CCSprite* m_pBall;
    double    m_fLastTime;
};

#endif  // __HELLOWORLD_SCENE_H__


看.cpp

#include "HelloWorldScene.h"

using namespace cocos2d;

#define FIX_POS(_pos, _min, _max) \
    if (_pos < _min)        \
    _pos = _min;        \
else if (_pos > _max)   \
    _pos = _max;        \

HelloWorld::HelloWorld()
: m_fLastTime(0.0)
{
}

HelloWorld::~HelloWorld()
{
	 m_pBall->release();
}

CCScene* HelloWorld::scene()
{
    CCScene * scene = NULL;
    do 
    {
        // 'scene' is an autorelease object
        scene = CCScene::create();
        CC_BREAK_IF(! scene);

        // 'layer' is an autorelease object
        HelloWorld *layer = HelloWorld::create();
        CC_BREAK_IF(! layer);

        // add layer as a child to scene
        scene->addChild(layer);
    } while (0);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {
        CC_BREAK_IF(! CCLayer::init());

        CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
            "CloseNormal.png",
            "CloseSelected.png",
            this,
            menu_selector(HelloWorld::menuCloseCallback));
        CC_BREAK_IF(! pCloseItem);

        // Place the menu item bottom-right conner.
        pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));

        // Create a menu with the "close" menu item, it's an auto release object.
        CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
        pMenu->setPosition(CCPointZero);
        CC_BREAK_IF(! pMenu);

        // Add the menu to HelloWorld layer as a child layer.
        this->addChild(pMenu, 1);

	//add Accelerometer
	CSize size = CCDirector::sharedDirector()->getWinSize();

        setAccelerometerEnabled(true);//打开重力感应

	m_pBall = CCSprite::create("ball.png");
	m_pBall->setPosition(ccp(size.width/2, size.height/2));
	addChild(m_pBall);

	m_pBall->retain();

        bRet = true;
    } while (0);

    return bRet;
}

void HelloWorld::menuCloseCallback(CCObject* pSender)
{
    // "close" menu item clicked
    CCDirector::sharedDirector()->end();
}

void HelloWorld::didAccelerate(CCAcceleration* pAccelerationValue)
{
//     double fNow = pAccelerationValue->timestamp;
// 
//     if (m_fLastTime > 0.0)
//     {
//         CCPoint ptNow = convertToUI
//     }
// 
//     m_fLastTime = fNow;
	CCSize size = CCDirector::sharedDirector()->getWinSize();

   	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);

	//9.8 重力加速度
    	ptTemp.x += pAccelerationValue->x * 9.81f;
    	ptTemp.y -= pAccelerationValue->y * 9.81f;

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



posted @ 2013-02-07 14:17  star特530  阅读(566)  评论(0编辑  收藏  举报