cocos2d-x重力感应



一、保证pos的位置在min,max内

  1. #define FIX_POS(_pos, _min, _max) \  
  2.     if (_pos < _min)        \  
  3.     _pos = _min;        \  
  4. else if (_pos > _max)   \  
  5.     _pos = _max;        \  
#define FIX_POS(_pos, _min, _max) \
    if (_pos < _min)        \
    _pos = _min;        \
else if (_pos > _max)   \
    _pos = _max;        \
用法,保证一个CCSprite在屏幕内。

  1. FIX_POS(ptNext.x, (VisibleRect::left().x+ballSize.width / 2.0), (VisibleRect::right().x - ballSize.width / 2.0));  
  2. FIX_POS(ptNext.y, (VisibleRect::bottom().y+ballSize.height / 2.0), (VisibleRect::top().y - ballSize.height / 2.0));  
    FIX_POS(ptNext.x, (VisibleRect::left().x+ballSize.width / 2.0), (VisibleRect::right().x - ballSize.width / 2.0));
    FIX_POS(ptNext.y, (VisibleRect::bottom().y+ballSize.height / 2.0), (VisibleRect::top().y - ballSize.height / 2.0));

二、设置CCLayer层的onEnter里面设置重力感应。设置了重力感应。如果是PC,没有重力感应,就是用方向键控制。

  1. void xxxLayer::onEnter()  
  2. {  
  3.     CCLayer::onEnter();  
  4.     setAccelerometerEnabled(true);  
  5. }  
void xxxLayer::onEnter()
{
    CCLayer::onEnter();
    setAccelerometerEnabled(true);
}

当重力感应方向变化时候,会调用

  1. void AccelerometerTest::didAccelerate(CCAcceleration* pAccelerationValue)  
  2. {  
  3.     CCPoint ptNow  = m_pBall->getPosition();  
  4.     CCPoint ptTemp = pDir->convertToUI(ptNow);  
  5.   
  6.     ptTemp.x += pAccelerationValue->x * 9.81f;  
  7.     ptTemp.y -= pAccelerationValue->y * 9.81f;  
  8.   
  9.     CCPoint ptNext = pDir->convertToGL(ptTemp);  
  10. }  
void AccelerometerTest::didAccelerate(CCAcceleration* pAccelerationValue)
{
    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);
}

pAccelerationValue包含x,y,z三个方向的重力值。

三、removeChild删除子控件不奔溃的处理办法。

  1. void CrashTest::onEnter()  
  2. {  
  3.     ActionManagerTest::onEnter();  
  4.   
  5.     CCSprite* child = CCSprite::create(s_pPathGrossini);  
  6.     child->setPosition( VisibleRect::center() );  
  7.     addChild(child, 1);  
  8.   
  9.     //Sum of all action's duration is 1.5 second.  
  10.     child->runAction(CCRotateBy::create(1.5f, 90));  
  11.     child->runAction(CCSequence::create(  
  12.                                             CCDelayTime::create(1.4f),  
  13.                                             CCFadeOut::create(1.1f),  
  14.                                             NULL)  
  15.                     );  
  16.       
  17.     //After 1.5 second, self will be removed.  
  18.     runAction( CCSequence::create(  
  19.                                     CCDelayTime::create(1.4f),  
  20.                                     CCCallFunc::create(this, callfunc_selector(CrashTest::removeThis)),  
  21.                                     NULL)  
  22.              );  
  23. }  
  24.   
  25. void CrashTest::removeThis()  
  26. {  
  27.     m_pParent->removeChild(thistrue);  
  28. }  
void CrashTest::onEnter()
{
    ActionManagerTest::onEnter();

    CCSprite* child = CCSprite::create(s_pPathGrossini);
    child->setPosition( VisibleRect::center() );
    addChild(child, 1);

    //Sum of all action's duration is 1.5 second.
    child->runAction(CCRotateBy::create(1.5f, 90));
    child->runAction(CCSequence::create(
                                            CCDelayTime::create(1.4f),
                                            CCFadeOut::create(1.1f),
                                            NULL)
                    );
    
    //After 1.5 second, self will be removed.
    runAction( CCSequence::create(
                                    CCDelayTime::create(1.4f),
                                    CCCallFunc::create(this, callfunc_selector(CrashTest::removeThis)),
                                    NULL)
             );
}

void CrashTest::removeThis()
{
    m_pParent->removeChild(this, true);
}
四、addAction最后一个参数设为ture暂停动作,然后resumeTarget恢复动作,3秒后执行移动动作。
  1. void PauseTest::onEnter()  
  2. {  
  3.     //  
  4.     // This test MUST be done in 'onEnter' and not on 'init'  
  5.     // otherwise the paused action will be resumed at 'onEnter' time  
  6.     //  
  7.     ActionManagerTest::onEnter();  
  8.       
  9.   
  10.     CCLabelTTF* l = CCLabelTTF::create("After 5 seconds grossini should move""Thonburi", 16);  
  11.     addChild(l);  
  12.     l->setPosition( ccp(VisibleRect::center().x, VisibleRect::top().y-75) );  
  13.       
  14.       
  15.     //  
  16.     // Also, this test MUST be done, after [super onEnter]  
  17.     //  
  18.     CCSprite* grossini = CCSprite::create(s_pPathGrossini);  
  19.     addChild(grossini, 0, kTagGrossini);  
  20.     grossini->setPosition(VisibleRect::center() );  
  21.       
  22.     CCAction* action = CCMoveBy::create(1, ccp(150,0));  
  23.   
  24.     CCDirector* pDirector = CCDirector::sharedDirector();  
  25.     pDirector->getActionManager()->addAction(action, grossini, true);  
  26.   
  27.     schedule( schedule_selector(PauseTest::unpause), 3);   
  28. }  
  29.   
  30. void PauseTest::unpause(float dt)  
  31. {  
  32.     unschedule( schedule_selector(PauseTest::unpause) );  
  33.     CCNode* node = getChildByTag( kTagGrossini );  
  34.     CCDirector* pDirector = CCDirector::sharedDirector();  
  35.     pDirector->getActionManager()->resumeTarget(node);  
  36. }  
void PauseTest::onEnter()
{
    //
    // This test MUST be done in 'onEnter' and not on 'init'
    // otherwise the paused action will be resumed at 'onEnter' time
    //
    ActionManagerTest::onEnter();
    

    CCLabelTTF* l = CCLabelTTF::create("After 5 seconds grossini should move", "Thonburi", 16);
    addChild(l);
    l->setPosition( ccp(VisibleRect::center().x, VisibleRect::top().y-75) );
    
    
    //
    // Also, this test MUST be done, after [super onEnter]
    //
    CCSprite* grossini = CCSprite::create(s_pPathGrossini);
    addChild(grossini, 0, kTagGrossini);
    grossini->setPosition(VisibleRect::center() );
    
    CCAction* action = CCMoveBy::create(1, ccp(150,0));

    CCDirector* pDirector = CCDirector::sharedDirector();
    pDirector->getActionManager()->addAction(action, grossini, true);

    schedule( schedule_selector(PauseTest::unpause), 3); 
}

void PauseTest::unpause(float dt)
{
    unschedule( schedule_selector(PauseTest::unpause) );
    CCNode* node = getChildByTag( kTagGrossini );
    CCDirector* pDirector = CCDirector::sharedDirector();
    pDirector->getActionManager()->resumeTarget(node);
}

五、停止动作stopActionByTag。特别注意的是动作和CCSprite加了标志,比如setTag(kTagSequence)方便以后查找。下面代码是先用getChildByTab(kTagGrossini)获取节点。然后stopActionByTay(kTagSequence);
  1. void RemoveTest::onEnter()  
  2. {  
  3.     ActionManagerTest::onEnter();  
  4.   
  5.     CCMoveBy* pMove = CCMoveBy::create(2, ccp(200, 0));  
  6.     CCCallFunc* pCallback = CCCallFunc::create(this, callfunc_selector(RemoveTest::stopAction));  
  7.     CCActionInterval* pSequence = CCSequence::create(pMove, pCallback, NULL);  
  8.     pSequence->setTag(kTagSequence);  
  9.   
  10.     CCSprite* pChild = CCSprite::create(s_pPathGrossini);  
  11.     pChild->setPosition( VisibleRect::center() );  
  12.   
  13.     addChild(pChild, 1, kTagGrossini);  
  14.     pChild->runAction(pSequence);  
  15. }  
  16.   
  17. void RemoveTest::stopAction()  
  18. {  
  19.     CCNode* pSprite = getChildByTag(kTagGrossini);  
  20.     pSprite->stopActionByTag(kTagSequence);  
  21. }  
void RemoveTest::onEnter()
{
    ActionManagerTest::onEnter();

    CCMoveBy* pMove = CCMoveBy::create(2, ccp(200, 0));
    CCCallFunc* pCallback = CCCallFunc::create(this, callfunc_selector(RemoveTest::stopAction));
    CCActionInterval* pSequence = CCSequence::create(pMove, pCallback, NULL);
    pSequence->setTag(kTagSequence);

    CCSprite* pChild = CCSprite::create(s_pPathGrossini);
    pChild->setPosition( VisibleRect::center() );

    addChild(pChild, 1, kTagGrossini);
    pChild->runAction(pSequence);
}

void RemoveTest::stopAction()
{
    CCNode* pSprite = getChildByTag(kTagGrossini);
    pSprite->stopActionByTag(kTagSequence);
}
六、先暂停动作,然后pauseTager,然后runAction一个动作,这样resumeTager的话,就可以同时执行2个动作了。
  1. void ResumeTest::onEnter()  
  2. {  
  3.     ActionManagerTest::onEnter();  
  4.   
  5.     CCSprite* pGrossini = CCSprite::create(s_pPathGrossini);  
  6.     addChild(pGrossini, 0, kTagGrossini);  
  7.     pGrossini->setPosition(VisibleRect::center());  
  8.   
  9.     pGrossini->runAction(CCScaleBy::create(2, 2));  
  10.   
  11.     CCDirector* pDirector = CCDirector::sharedDirector();  
  12.     pDirector->getActionManager()->pauseTarget(pGrossini);  
  13.     pGrossini->runAction(CCRotateBy::create(2, 360));  
  14.   
  15.     this->schedule(schedule_selector(ResumeTest::resumeGrossini), 3.0f);  
  16. }  
  17.   
  18. void ResumeTest::resumeGrossini(float time)  
  19. {  
  20.     this->unschedule(schedule_selector(ResumeTest::resumeGrossini));  
  21.   
  22.     CCNode* pGrossini = getChildByTag(kTagGrossini);  
  23.     CCDirector* pDirector = CCDirector::sharedDirector();  
  24.     pDirector->getActionManager()->resumeTarget(pGrossini);  
  25. }  
void ResumeTest::onEnter()
{
    ActionManagerTest::onEnter();

    CCSprite* pGrossini = CCSprite::create(s_pPathGrossini);
    addChild(pGrossini, 0, kTagGrossini);
    pGrossini->setPosition(VisibleRect::center());

    pGrossini->runAction(CCScaleBy::create(2, 2));

    CCDirector* pDirector = CCDirector::sharedDirector();
    pDirector->getActionManager()->pauseTarget(pGrossini);
    pGrossini->runAction(CCRotateBy::create(2, 360));

    this->schedule(schedule_selector(ResumeTest::resumeGrossini), 3.0f);
}

void ResumeTest::resumeGrossini(float time)
{
    this->unschedule(schedule_selector(ResumeTest::resumeGrossini));

    CCNode* pGrossini = getChildByTag(kTagGrossini);
    CCDirector* pDirector = CCDirector::sharedDirector();
    pDirector->getActionManager()->resumeTarget(pGrossini);
}


转自:http://blog.csdn.net/hayyoung/article/details/8804909

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值