其中,动作又分为持续动作(延时动作)和瞬时动作,分别通过CCActionInterval类以及CCActionInstant类实现。
在这里主要介绍一下,持续动作。
ocos2d-x提供的基本延时类动作都提供了ActionTo和ActionBy两种:(Action泛指各种动作)
ActionTo是指动作结束的状态,也就是动作的终点。
ActionBy是指动作执行的状态,也就是动作的执行过程。
常用的延时动作类包括:
移动动作:CCMoveBy CCMoveTo
旋转动作:CCRotateBy CCRotateTo
缩放动作:CCScaleBy CCScaleTo
跳跃动作:CCJumpBy CCJumpTo
淡入淡出动作:CCFadeBy CCFadeIn CCFadeOut
贝赛尔曲线动作:CCBezierBy CCBezierTo
(具体可以参见 http://cn.cocos2d-x.org/document/index/class?url=dd/d6e/classcocos2d_1_1_c_c_call_func.html)CCMoveTo中的CCPoint参数就是想要“移动到”的位置点,而CCMoveBy中的CCPoint参数就是分别对应x,y轴对应的偏移量
注意:actionBy不能重复使用,如果第二次使用的话,会继续从第一次使用到的位置开始继续!
一般用法:
void HelloWorld::spriteMove()
{
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCActionInterval *actionTo = CCMoveTo::actionWithDuration(2.0f,
CCPointMake(winSize.width * 3 / 4, winSize.height / 2));
CCActionInterval *actionBy = CCMoveBy::actionWithDuration(2.0f,
CCPointMake(-winSize.width / 2, 0));
CCActionInterval *actionByCopy = (CCActionInterval *) actionBy->copy();
CCActionInterval *actionBack = actionBy->reverse();
oldManSprite->runAction(CCSequence::actions(actionTo, actionByCopy, NULL));
youngSisterSprite->runAction(CCSequence::actions(actionBy, actionBack, NULL));
}
在动作完成之后,我们需要回调相应的函数,动作一般支持三种回调方式:
(1)无发送者无数据回调——CCCallFunc:
void HelloWorld::actionCallback()
{
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCLabelTTF *label = CCLabelTTF::labelWithString("Action Callback!", "Marker Felt", 32);
label->setPosition(ccp(winSize.width / 2, winSize.height / 2));
this->addChild(label);
}
(2)有发送者无数据回调——CCCallFuncN (N是CCNode):
void HelloWorld::actionCallbackN(CCNode *pSender)
{
CCSprite *sprite = (CCSprite *) pSender;
// 回调变红色
sprite->setColor(ccRED);
}
(3)有发送者有数据回调——CCCallFuncND (N是CCNode,D是data,是void *类型):
void HelloWorld::actionCallbackND(CCNode *pSender, void *data)
{
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSprite *sprite = (CCSprite *) pSender;
// 回调变蓝色
sprite->setColor(ccBLUE);
// 接收回调数据
CCLabelTTF *label = CCLabelTTF::labelWithString((char *) data, "Marker Felt", 32);
label->setPosition(ccp(winSize.width / 2, winSize.height / 2));
this->addChild(label);
CCLog((char *) data);
}
测试函数:
void HelloWorld::actionListen()
{
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCFiniteTimeAction *action = CCSequence::actions(
CCMoveBy::actionWithDuration(2.0f, CCPointMake(winSize.width / 2, 0)),
CCCallFunc::actionWithTarget(this, callfunc_selector(HelloWorld::actionCallback)), NULL);
CCFiniteTimeAction *actionN = CCSequence::actions(
CCMoveBy::actionWithDuration(2.0f, CCPointMake(-winSize.width / 2, 0)),
CCCallFuncN::actionWithTarget(this, callfuncN_selector(HelloWorld::actionCallbackN)), NULL);
CCFiniteTimeAction *actionND = CCSequence::actions(
CCMoveBy::actionWithDuration(2.0f, CCPointMake(winSize.width / 2, 0)),
CCCallFuncND::actionWithTarget(this, callfuncND_selector(HelloWorld::actionCallbackND), (void *) "Callback Data"), NULL);
oldManSprite->runAction(actionND);
youngSisterSprite->runAction(actionN);
}
2.动画(Animation)是一种特殊的持续性动作。只能应用与精灵之上,用于实现帧动画效果。
可以使用多个帧创建动画序列(CCAnimation), 然后将动画序列创建成帧动画(CCAnimate)。