四.cocos2d-x中的动画与动作

1.动作(Action)作用于游戏元素,可以使游戏元素运动起来,例如:移动、旋转、闪烁、消失等。通过CCAction类实现。
    其中,动作又分为持续动作(延时动作)和瞬时动作,分别通过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);
}

总结:如果只是简单的通知,则使用CCCallFunc;如果需要知道发送者信息,则使用CCCallFuncN;如果还要附带一些数据信息,则使用CCCallFuncND

测试函数:
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)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值