您的位置:首页 > 移动开发 > Cocos引擎

[Cocos2d-x For WP8]Action 常用动作

2013-08-19 22:10 344 查看
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项目里面,就可以看到相关的运行效果了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: