cocos2d-x学习笔记(四)动作(Action)

来源:互联网 发布:iphone4 ios7越狱优化 编辑:程序博客网 时间:2024/05/19 10:08

cocos2d-x引擎中,动作(Action)定义了在节点上的通用操作,他不依赖于节点,但是
在运行时需要指定节点为目标,动作最直观的好处就是可以实现很多动画效果,如精灵的行走、
跳跃等

 

CCAction是所有动作的基类:

 

CCSpeed:调整实体(节点)的执行速度;CCFollow:可以使节点跟随指定的另一个节点移动

 

瞬时动作(CCActionInstant)与延时动作(CCActionInterval):

瞬时动作的主要特点就是不需要花费时间,瞬间就能完成动作的执行,这些动作的基类为CCActionInstant

延时动作的主要特点就是执行动作需要花费一定的时间,这些动作的基类为CCActionInterval

 

CCMoveTo和CCMoveBy的区别
移动精灵,两者的区别在于:CCMoveTo是移动到指定坐标,CCMoveBy是相对坐标。
如ccp(80,80),前者表示移动到x=80,y=80处,后者表示向x方向移动80个单位,向y方向移动80个单位。

void ActionsDemo::onEnter()  //场景加载时的回调函数{    CCLayer::onEnter();    // Or you can create an sprite using a filename. only PNG is supported now. Probably TIFF too    m_grossini = CCSprite::create(s_pPathGrossini);    m_grossini->retain();    m_tamara = CCSprite::create(s_pPathSister1);     m_tamara->retain();    m_kathia = CCSprite::create(s_pPathSister2);    m_kathia->retain();    addChild(m_grossini, 1);    addChild(m_tamara, 2);    addChild(m_kathia, 3);    m_grossini->setPosition(ccp(VisibleRect::center().x, VisibleRect::bottom().y+VisibleRect::getVisibleRect().size.height/3));    m_tamara->setPosition(ccp(VisibleRect::center().x, VisibleRect::bottom().y+VisibleRect::getVisibleRect().size.height*2/3));    m_kathia->setPosition(ccp(VisibleRect::center().x, VisibleRect::bottom().y+VisibleRect::getVisibleRect().size.height/2));     // add title and subtitle    std::string str = title();    const char * pTitle = str.c_str();    CCLabelTTF* label = CCLabelTTF::create(pTitle, "Arial", 18);    addChild(label, 1);    label->setPosition( ccp(VisibleRect::center().x, VisibleRect::top().y - 30) );    std::string strSubtitle = subtitle();    if( ! strSubtitle.empty() )     {        CCLabelTTF* l = CCLabelTTF::create(strSubtitle.c_str(), "Thonburi", 22);        addChild(l, 1);        l->setPosition( ccp(VisibleRect::center().x, VisibleRect::top().y - 60) );    }        // add menu    CCMenuItemImage *item1 = CCMenuItemImage::create(s_pPathB1, s_pPathB2, this, menu_selector(ActionsDemo::backCallback) );    CCMenuItemImage *item2 = CCMenuItemImage::create(s_pPathR1, s_pPathR2, this, menu_selector(ActionsDemo::restartCallback) );    CCMenuItemImage *item3 = CCMenuItemImage::create(s_pPathF1, s_pPathF2, this, menu_selector(ActionsDemo::nextCallback) );    CCMenu *menu = CCMenu::create(item1, item2, item3, NULL);    menu->setPosition(CCPointZero);    item1->setPosition(ccp(VisibleRect::center().x - item2->getContentSize().width*2, VisibleRect::bottom().y+item2->getContentSize().height/2));    item2->setPosition(ccp(VisibleRect::center().x, VisibleRect::bottom().y+item2->getContentSize().height/2));    item3->setPosition(ccp(VisibleRect::center().x + item2->getContentSize().width*2, VisibleRect::bottom().y+item2->getContentSize().height/2));    addChild(menu, 1);}


 

void ActionsDemo::onExit()  //场景结束时的回调函数{    m_grossini->release();  //在onEnter()中调用retain()的对象需要在这里释放    m_tamara->release();    m_kathia->release();    CCLayer::onExit();  //必须调用父类的onExit否则内存泄漏}


 

void ActionMove::onEnter(){    ActionsDemo::onEnter();    centerSprites(3);    CCSize s = CCDirector::sharedDirector()->getWinSize();    CCActionInterval*  actionTo = CCMoveTo::create(2, ccp(s.width-40, s.height-40)); //移动到(s.width-40,s.height-40)    CCActionInterval*  actionBy = CCMoveBy::create(2, ccp(80,80)); //当前点移动(80,80),而不是移动到(80,80)    CCActionInterval*  actionByBack = actionBy->reverse(); //做相反的动作    m_tamara->runAction( actionTo); //执行动画    m_grossini->runAction( CCSequence::create(actionBy, actionByBack, NULL));    m_kathia->runAction(CCMoveTo::create(1, ccp(40,40)));}


CCSequence是动作序列,把若干个动作按顺序组合在一起,然后依次执行,NULL是结束标志。
reverse()表示执行该动作的逆动作,即恢复到原样。

以此类推其它的动作基本差不多,可以参考TestCpp例子:

如:CCScaleTo和CCScaleBy
缩放精灵,前者表示缩放到xx倍;后者表示缩放xx倍

 

CCSpawn:跟CCSequence不一样的是,它表示将若干个动作组合在一起,同时执行它们,执行时间以最长的那个动作为准

精灵边旋转边跳跃,2秒的时间跳跃4次,每次跳跃的高度是50个单位,沿x轴方向跳跃300个单位的距离;旋转720度。

void ActionSpawn::onEnter(){    ActionsDemo::onEnter();    alignSpritesLeft(1);    CCAction*  action = CCSpawn::create(        CCJumpBy::create(2, ccp(300,0), 50, 4),        CCRotateBy::create( 2,  720),        NULL);    m_grossini->runAction(action);}


CCRepeatForever:表示无限的重复执行某个动作或动作序列:

void ActionRepeatForever::repeatForever(CCNode* pSender){    CCRepeatForever *repeat = CCRepeatForever::create( CCRotateBy::create(1.0f, 360) );    pSender->runAction(repeat);}


CCRepeat:表示重复执行某个动作或者动作序列,但是是有限次的重复,可以指定重复次数:


 

void ActionRotateToRepeat::onEnter(){    ActionsDemo::onEnter();    centerSprites(2);    CCActionInterval*  act1 = CCRotateTo::create(1, 90);    CCActionInterval*  act2 = CCRotateTo::create(1, 0);    CCActionInterval*  seq = (CCActionInterval*)(CCSequence::create(act1, act2, NULL));    CCActionInterval*  rep2 = CCRepeat::create((CCFiniteTimeAction*)(seq->copy()->autorelease()), 10); //有限重复    m_kathia->runAction(rep2);}


 

CCDelayTime:表示延迟,在动作之间加一个间歇时间。如下面的代码表示:精灵执行一个move动作后,暂停2秒,再继续执行后面的move动作。

void ActionDelayTime::onEnter(){    ActionsDemo::onEnter();    alignSpritesLeft(1);    CCActionInterval*  move = CCMoveBy::create(1, ccp(150,0));    CCFiniteTimeAction*  action = CCSequence::create( move, CCDelayTime::create(2), move, NULL);    m_grossini->runAction(action);}


 

 

原创粉丝点击