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


好的,让我来回答你关于 cocos2d-x 中 scrollView 的问题。 scrollView 是 cocos2d-x 中常用的 UI 控件之一,可以用来显示大量的内容,并支持滑动、缩放等功能。在 scrollView 中,可以添加多个子控件,比如 label、sprite 等,也可以添加自定义的控件。 在使用 scrollView 时,需要先创建一个 ScrollView 对象,然后设置它的属性,比如大小、位置、滑动方向等。接着,再往 scrollView 中添加子控件,最后将 scrollView 添加到场景中即可。 下面是一个简单的示例代码,演示如何创建一个垂直方向的 scrollView: ``` // 创建 scrollView 对象 auto scrollView = ScrollView::create(); scrollView->setContentSize(Size(200, 300)); scrollView->setDirection(ScrollView::Direction::VERTICAL); scrollView->setInnerContainerSize(Size(200, 800)); scrollView->setPosition(Vec2(100, 100)); // 往 scrollView 中添加子控件 for (int i = 0; i < 10; i++) { auto label = Label::createWithSystemFont("Label " + std::to_string(i), "Arial", 24); label->setPosition(Vec2(100, 700 - i * 70)); scrollView->addChild(label); } // 将 scrollView 添加到场景中 this->addChild(scrollView); ``` 在上面的代码中,我们首先创建了一个 scrollView 对象,设置了它的大小、位置和滑动方向等属性。然后,使用循环往 scrollView 中添加了 10 个 label,最后将 scrollView 添加到场景中。 通过以上代码,你可以学会如何使用 cocos2d-x 中的 scrollView 控件。希望对你有所帮助!
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值