[Cocos2d-x For WP8]Action 常用动作
Action相当于是Cocos2d-x里面的动画操作,在Cocos2d-x里面的动画基类是CCAction类,从CCAction类派生出来的就有很多常用的动作的实现类,利用这些类就可以给我们游戏的精灵实现丰富的动作效果,类似于我们在WP8里面使用各种各样的动画类实现动画效果一样。那么下面就是这些类的结构图:
官方的技术文档可以参考下面的地址:
http://www.cocos2d-x.org/reference/native-cpp/d7/d12/classcocos2d_1_1_c_c_action.html
那么从上图可以看到Cocos2d-x提供了很多基本的动作类,主要包括两大类:一类是瞬时动作(CCActionInstant),一类是延时动作(CCActionInterval)。
瞬时动作CCActionInstanse是没有执行过程,动作瞬间就执行完成了;CCActionInterval则是执行需要一个过程,跟我们编写的普通程序的动画一样的原理。下面我们主要介绍下延时动作,延时动作有下面这些:移动(CCMoveTo/CCMoveBy)、缩放(CCScaleTo/CCScaleBy)、旋转(CCRotateTO/CCRotateBy)、扭曲(CCSkewTo/CCSkewBy)、跳跃(CCJumpTo/CCJumpBy)、贝塞尔曲线(CCBezierTo/CCBezierBy)、闪烁(CCBink)、淡入淡出(CCFadeIn/CCFadeOut)、染色(CCTintTo/CCTintBy)等,我们也可以把上面这些动作的几个组合成一个序列来执行,多种效果混合在一起。
下面是一些代码的实例:
//在init方法里面初始化当前的实例 bool RotateWorldTest::init() { bool bRet = false; do { //CCLayer进行初始化,初始化失败跳出循环 if ( !CCLayer::init() ) { break; } //获取手机屏幕的大小 CCSize size = CCDirector::sharedDirector()->getWinSize(); //创建图片精灵 CCSprite *sprite = CCSprite::create("cat.png"); sprite->setPosition(ccp(size.width * 0.5, size.height * 0.5)); sprite->setScale(1.5f); this->addChild(sprite); //移动 //从当前的位置到新的位置 CCActionInterval* actionMoveTo = CCMoveTo::create(2, ccp(size.width-40, size.height-40)); sprite->runAction( actionMoveTo); //从当前的位置递增到另外的位置,然后再返回 CCActionInterval* actionMoveBy = CCMoveBy::create(2, ccp(80,80)); CCActionInterval* actionMoveByBack = actionMoveBy->reverse(); sprite->runAction( CCSequence::create(actionMoveBy, actionMoveByBack, NULL)); //缩放 CCActionInterval* actionScaleTo = CCScaleTo::create(2.0f, 0.5f); sprite->runAction( actionScaleTo); CCActionInterval* actionScaleBy = CCScaleBy::create(2.0f, 1.0f, 10.0f); sprite->runAction( CCSequence::create(actionScaleBy, actionScaleBy->reverse(), NULL)); //倾斜 CCActionInterval *actionSkewTo = CCSkewTo::create(2, 37.2f, -37.2f); sprite->runAction( actionSkewTo); CCActionInterval *actionSkewBy = CCSkewBy::create(2, 0.0f, -90.0f); sprite->runAction(actionSkewBy); //旋转 CCRotateTo* actionRotateTo = CCRotateTo::create(2, 37.2f, -37.2f); sprite->runAction( actionRotateTo); CCRotateBy* actionRotateBy = CCRotateBy::create(2, 0.0f, -90.0f); sprite->runAction( actionRotateBy); //跳跃 CCActionInterval* actionJumpTo = CCJumpTo::create(2, ccp(300,300), 50, 4); sprite->runAction( actionJumpTo); CCActionInterval* actionJumpBy = CCJumpBy::create(2, ccp(300,0), 50, 4); CCActionInterval* actionJumpByBack = actionJumpBy->reverse(); sprite->runAction( CCSequence::create(actionJumpBy, actionJumpByBack, NULL)); CCActionInterval* actionJumpUp = CCJumpBy::create(2, ccp(0,0), 80, 4); sprite->runAction( CCRepeatForever::create(actionJumpUp)); //贝塞尔曲线运动 ccBezierConfig bezier; bezier.controlPoint_1 = ccp(0, size.height/2); bezier.controlPoint_2 = ccp(300, -size.height/2); bezier.endPosition = ccp(300,100); CCActionInterval* bezierForward = CCBezierBy::create(3, bezier); CCActionInterval* bezierBack = bezierForward->reverse(); CCAction* rep = CCRepeatForever::create(CCSequence::create( bezierForward, bezierBack, NULL)); sprite->runAction( rep); sprite->setPosition(ccp(80,160)); ccBezierConfig bezier2; bezier2.controlPoint_1 = ccp(100, size.height/2); bezier2.controlPoint_2 = ccp(200, -size.height/2); bezier2.endPosition = ccp(240,160); CCActionInterval* bezierTo1 = CCBezierTo::create(2, bezier2); sprite->runAction(bezierTo1); sprite->setPosition(ccp(400,160)); CCActionInterval* bezierTo2 = CCBezierTo::create(2, bezier2); sprite->runAction(bezierTo2); //闪烁效果 CCActionInterval* actionBlink1 = CCBlink::create(2, 10); sprite->runAction( actionBlink1); //淡出淡入 CCActionInterval* actionFadeIn1 = CCFadeIn::create(1.0f); CCActionInterval* action1FadeInBack = actionFadeIn1->reverse(); sprite->runAction( CCSequence::create( actionFadeIn1, action1FadeInBack, NULL)); CCActionInterval* actionFadeOut2 = CCFadeOut::create(1.0f); CCActionInterval* actionFadeOut2Back = actionFadeOut2->reverse(); sprite->runAction( CCSequence::create( actionFadeOut2, actionFadeOut2Back, NULL)); //色彩 CCActionInterval* actionTint1 = CCTintTo::create(2, 255, 0, 255); sprite->runAction( actionTint1); CCActionInterval* actionTint2 = CCTintBy::create(2, -127, -255, -127); CCActionInterval* actionTint2Back = actionTint2->reverse(); sprite->runAction( CCSequence::create( actionTint2, actionTint2Back, NULL)); //接收界面的的触摸事件 setTouchEnabled(true); bRet = true; } while (0); //返回成功 return bRet; }
把代码复制到Hello World项目里面,就可以看到相关的运行效果了。