本文是自己整理的, 如果有错误,请大牛们提出纠正, 谢谢。
下面是继承关系图:
CCAction.h头文件夹, 包含了三个类; CCActionInterval.h头文件夹包含了基本的常用动作; CCActionProgressTimer.h、CCActionCamera.h、CCActionCatmullRom.h、CCActionEase.h都继承自CCActionInterval类.
以下是对这些类的理解, 如果看不到,再刷新下网页即可.
bool HelloWorld::init() {
if (!CCLayer::init()) {
return false;
}
CCMenuItemImage *pCloseItem = CCMenuItemImage::create("CloseNormal.png",
"CloseSelected.png", this,
menu_selector(HelloWorld::menuCloseCallback));
pCloseItem->setPosition(
ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
pMenu->setPosition(CCPointZero);
this->addChild(pMenu, 1);
CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();
cache->removeUnusedSpriteFrames();
cache->addSpriteFramesWithFile("animation/grossini_family.plist",
"animation/grossini_family.png");
//grossini.png grossinis_sister1.png grossinis_sister2.png
CCSprite* gross = CCSprite::createWithSpriteFrame(
cache->spriteFrameByName("grossini.png"));
CCSprite* sister1 = CCSprite::createWithSpriteFrame(
cache->spriteFrameByName("grossinis_sister1.png"));
CCSprite* sister2 = CCSprite::createWithSpriteFrame(
cache->spriteFrameByName("grossinis_sister2.png"));
gross->setPosition(ccp(200, 100));
sister1->setPosition(ccp(200, 500));
addChild(gross);
addChild(sister1);
/////////////////////////////
/** Action动作*/
// CCSequence 按顺序执行动作, 下面会有学习
// CCMoveBy 移动目标 参数1:移动到目标坐标所需的时间 参数2:目标坐标(pos)
// CCMoveTo 作用、参数一样
// 两者:支持支持reverse(倒退), CCMoveBy:移动到(相对当前的坐标再加pos), CCMoveTo:直接移动到pos
/*
CCActionInterval* moveBy = CCMoveBy::create(2.0f, ccp(500, 500));
CCActionInterval* moveTo = CCMoveTo::create(2.0f, ccp(500, 500));
CCActionInterval* ToBack = moveTo->reverse();
gross->runAction(moveBy);
sister1->runAction(CCSequence::create(moveTo, ToBack, NULL));
*/
// CCScaleTo 缩放目标 参数1:缩放持续的时间
// 参数2:缩放比例(scale)(这里是宽高都同时缩放, 还有一种创建是对宽和高进行不同比例的缩放)
// CCScaleBy 作用、参数一样
// CCScaleBy:支持reverse(倒退),缩放(相对当前的缩放值再乘以参数2(scale)),
// CCMoveTo:不支持reverse, 直接缩放到参数2, 不用管原来的缩放比例
/*
gross->setScale(0.5f); // 这里先设置下当前缩放为0.5f, 方便后面对照
sister1->setScale(0.5f);
CCActionInterval* scaleBy = CCScaleBy::create(5.0f, 3.0f);
CCActionInterval* scaleTo = CCScaleTo::create(5.0f, 3.0f);
CCActionInterval* scaleToWAndH = CCScaleTo::create(5.0f, 5.0f, 0.8f);
sister1->runAction(
CCSequence::create(scaleBy, scaleBy->reverse(), scaleToWAndH,
NULL));
gross->runAction(scaleTo);
*/
// CCRotateTo 旋转目标 参数1:旋转的时间
// 参数2:旋转饿角度 正数为顺时针, 负数为逆时针,
// 如果为720,则在RotateTo中实际转了360度,属于代码内部设定, 为360时, CCRotateTo没有作用
// 另一种create, 参数2: 沿X轴旋转, 参数3:沿Y轴旋转
// CCRotateBy 作用、参数一样
// CCRotateBy: 支持reverse(倒退), 在原来的旋转角度上进行旋转
// CCRotateTo: 不支持reverse, 直接旋转 参数2, 不用管原来的旋转角度
/*
CCActionInterval* rotateBy = CCRotateBy::create(3.0f, 360);
CCActionInterval* rotateTo = CCRotateTo::create(3.0f, 720);
CCActionInterval* rotateX = CCRotateBy::create(3.0f, 90, 0);
CCActionInterval* rotateY = CCRotateBy::create(3.0f, 0, 90);
gross->runAction(rotateTo);
sister1->runAction(
CCSequence::create(rotateBy, rotateBy->reverse(), rotateX,
rotateX->reverse(), rotateY, rotateY->reverse(), NULL));
*/
// CCSkewTo 倾斜目标 参数1:倾斜持续时间
// 参数2:x轴的倾斜角度, 参数3:y轴的倾斜角度
// CCSkewBy 作用、参数一样
// CCSkewBy 支持reverse, 在原来的基础上倾斜
// CCSkewTo 直接倾斜, 不用管原来的倾斜度
/*
gross->setSkewX(10); // 方便后面对比
gross->setSkewY(10);
sister1->setSkewX(10);
sister1->setSkewY(10);
CCActionInterval * skewBy = CCSkewBy::create(3, 20, 20);
CCActionInterval * skewTo = CCSkewTo::create(3, 20, 20);
CCActionInterval * skewByX = CCSkewBy::create(3, 20, 0);
CCActionInterval * skewByY = CCSkewBy::create(3, 0, 20);
gross->runAction(skewTo);
sister1->runAction(
CCSequence::create(skewBy, skewBy->reverse(),
CCSkewTo::create(2, 0, 0), skewByX, skewByX->reverse(),
skewByY, skewByY->reverse(), NULL));
*/
// CCJumpTo 跳跃到目标位置 参数1:总的持续时间, 参数2:目标位置(pos)
// 参数3:跳跃的高度, 参数4:在持续的时间内跳跃几次
// CCJumpBy 作用、参数相同
// CCJumpBy 支持reverse, 跳跃到(原来的位置+pos(相当于一段距离)之和)
// CCJumpTo 直接跳到pos位置, 不用管原来的位置
/*
CCActionInterval * jumpBy = CCJumpBy::create(3, ccp(500, 100), 50, 3);
CCActionInterval * jumpTo = CCJumpTo::create(3, ccp(500, 500), 50, 3);
gross->runAction(jumpTo);
sister1->runAction(CCSequence::create(jumpBy, jumpBy->reverse(), NULL));
*/
// CCBezier 贝塞尔曲线, 首先定义这个结构体, 设置控制点
/*
ccBezierConfig bezierCon;
bezierCon.controlPoint_1 = CCPointMake(200, 150); //控制点1
bezierCon.controlPoint_2 = CCPointMake(200, 160); //控制点2
bezierCon.endPosition = CCPointMake(340, 100); // 结束位置
*/
// CCBezierTo 创建一个贝塞尔曲线运动的动作, 参数1:持续时间, 参数2:贝塞尔曲线结构体
// CCBezierBy 作用和参数一样
// 当使用CCBezierTo时, ccBezierConfig的点都是绝对坐标点.
// 但如果使用CCBezierBy, ccBezierConfig的点都是相对坐标点, 支持reverse, 理解和前面的一样
/*
CCActionInterval * bezierTo = CCBezierTo::create(2, bezierCon);
CCActionInterval * bezierBy = CCBezierBy::create(3, bezierCon); //支持反向
gross->runAction(bezierTo);
sister1->runAction(CCSequence::create(bezierBy, bezierBy->reverse(), NULL));
*/
// CCFadeIn 目标渐变出现, 参数:持续时间
// CCFadeOut 目标渐变消失, 参数:持续时间
/*
CCActionInterval * fadeIn = CCFadeIn::create(2);
CCActionInterval * fadeOut = CCFadeOut::create(2);
gross->runAction(CCSequence::create(fadeIn, fadeOut, NULL));
*/
// CCTintTo 作用:创建一个色彩变化的动作, 参数1:色彩变化的动作, 参数2 :红色分量, 参数3:绿色分量, 参数3:蓝色分量
// CCTintBy 作用和参数一样, 同理, 它的色彩渐变也是相对原来的色彩进行的, 同理, 也支持reverse
/*
CCActionInterval * tintTo = CCTintTo::create(4, 255, 255, 0);
CCActionInterval * tintBy = CCTintBy::create(4, 255, 255, 0);
gross->runAction(tintTo);
sister1->runAction(CCSequence::create(tintBy, tintBy->reverse(), NULL));
*/
// CCBlink 目标闪烁, 参数1:持续时间, 参数2:闪烁次数
/*
CCActionInterval * blink = CCBlink::create(3, 5);
gross->runAction(blink);
*/
// CCDelayTime 延迟动作, 持续时间(延迟执行后续动作)
//CCActionInterval * delay = CCDelayTime::create(4);
// CCOrbitCamera 创建一个球面坐标轨迹进行旋转的动作 参数1:旋转轨迹的时间, 参数2:起始半径
// 参数3:半径差, 参数4:起始z角, 参数5:旋转z角的差, 参数6:起始x角, 参数7:旋转x角的差
// 如果参数4和参数5都为0时, 后面的参数6和7好像设置没有用
// 有时在反转时会产生遮挡问题,解决办法:
// 1 关闭深度测试 CCDirector::sharedDirector()->setDepthTest(false);
// 2 设置VertexZ上浮 spriteLeaf->setVertexZ(60);
//CCActionInterval * orbitCamera = CCOrbitCamera::create(3, 60, 0, 30, 60, 0, 0);
//gross->runAction(orbitCamera);
// 关于这个类的用法, 小菜也不是太了解, 以下是在网上找的关于翻牌的代码
/*
m_backStatus = 0; // 这两个是我定义的类成员变量
m_frontStatus = 0;
CCSprite* back = CCSprite::create("back.png");
back->setPosition(ccp(640, 360));
addChild(back);
CCSequence *seq1 = CCSequence::create(CCDelayTime::create(0.5f),
CCCallFuncN::create(this,
callfuncN_selector(HelloWorld::backCallfunc)),
CCDelayTime::create(1.0f),
CCCallFuncN::create(this,
callfuncN_selector(HelloWorld::backCallfunc)),
CCDelayTime::create(0.5f), NULL);
CCOrbitCamera *camera1 = CCOrbitCamera::create(2.0, 1, 0, 0, -360, 0, 0);
CCRepeatForever *repeat1 = CCRepeatForever::create(
CCSpawn::create(seq1, camera1, NULL));
back->runAction(repeat1);
CCSprite* front = CCSprite::create("front.png");
front->setPosition(ccp(640, 360));
front->setVisible(false);
addChild(front);
CCSequence *seq2 = CCSequence::create(CCDelayTime::create(0.5f),
CCCallFuncN::create(this,
callfuncN_selector(HelloWorld::frontCallfunc)),
CCDelayTime::create(1.0f),
CCCallFuncN::create(this,
callfuncN_selector(HelloWorld::frontCallfunc)),
CCDelayTime::create(0.5f), NULL);
CCOrbitCamera *camera2 = CCOrbitCamera::create(2.0, 1, 0, 0, -360, 0, 0);
CCRepeatForever *repeat2 = CCRepeatForever::create(
CCSpawn::create(seq2, camera2, NULL));
front->runAction(repeat2);
*/
// CCCardinalSpline
// 首先它们都需要点数组
CCPointArray* array = CCPointArray::create(20);
array->addControlPoint(ccp(0,0));
array->addControlPoint(ccp(210,0));
array->addControlPoint(ccp(210,240));
array->addControlPoint(ccp(0,160));
array->addControlPoint(ccp(0,0));
// CCCardinalSpline 创建一个基数样条曲线轨迹的动作, 参数1: 完成轨迹所需的时间
// 参数2: 控制点数组, 参数3: 张力 其值= 0 路径最柔和, = 1 分段直线, >1 向内弯曲, <1 向外弯曲
// CCCardinalSplineBy 作用和参数一样, 但点数组是相对的,可以理解为距离而不是目标点, 支持reverse
// CCCatmullRomTo 和 CCCatmullRomBy 是 cardinal基数样条曲线的张力为固定值0.5 的曲线, 用法一样
/*
CCActionInterval * cardinalSplineTo = CCCardinalSplineTo::create(3, array,
0);
CCActionInterval * cardinalSplineBy = CCCardinalSplineBy::create(3, array,
0);
gross->runAction(
CCSequence::create(cardinalSplineBy, cardinalSplineBy->reverse(),
cardinalSplineTo, NULL));
*/
// CCFollow 跟随动作, 参数1:跟随的目标对象, 参数2: 跟随范围,离开范围就不再跟随
//用sister1为参照物, 可以添加一个背景图, 这个小菜也不太理解
/*
CCActionInterval * move = CCMoveBy::create(5, ccp(4000, 0));
sister1->runAction(CCSequence::create(move, move->reverse(), NULL));
CCFollow* follow = CCFollow::create(sister1, CCRectMake(0, 0, 2000, 720));
this->runAction(follow);
*/
// CCSpeed 让目标动作运行速度加倍, 参数1:目标动作, 参数2:倍速
/*
CCSpeed * speed = CCSpeed::create(CCMoveBy::create(5, ccp(4000, 0)), 10);
sister1->runAction(speed);
*/
// CCEaseBounceIn 让目标动作赋予反弹力,且以目标动作开始位置开始反弹, 参数:目标动作
// sister1->runAction(CCEaseBounceIn::create(CCMoveTo::create(3, ccp(800, 500))));
// CCEaseBounceOut 让目标动作赋予反弹力,且以目标动作结束位置开始反弹, 参数目标动作
// sister1->runAction(CCEaseBounceOut::create(CCMoveTo::create(3, ccp(800, 500))));
// CCEaseBounceInOut 让目标动作赋予反弹力,且以目标动作开始和结束位置都反弹, 参数目标动作
// sister1->runAction(CCEaseBounceInOut::create(CCMoveTo::create(3, ccp(800, 500))));
// CCEaseBackIn 让目标动作赋予回力,且以目标动作开始位置作为回力点, 参数:目标动作
// sister1->runAction(CCEaseBackIn::create(CCMoveTo::create(3, ccp(800, 500))));
// CCEaseBackOut 让目标动作赋予回力,且以目标动作结束位置作为回力点, 参数:目标动作
// sister1->runAction(CCEaseBackOut::create(CCMoveTo::create(3, ccp(800, 500))));
// CCEaseBackInOut 让目标动作赋予回力,且以目标动作开始和结束位置作为回力点, 参数:目标动作
// sister1->runAction(CCEaseBackInOut::create(CCMoveTo::create(3, ccp(800, 500))));
// CCEaseElasticIn 让目标动作赋予弹性 ,且以目标动作开始位置赋予弹性, 参数:目标动作
// sister1->runAction(CCEaseElasticIn::create(CCMoveTo::create(3, ccp(800, 500))));
// CCEaseElasticOut 让目标动作赋予弹性 ,且以目标动作结束位置赋予弹性, 参数:目标动作
// sister1->runAction(CCEaseElasticOut::create(CCMoveTo::create(3, ccp(800, 500))));
// CCEaseElasticInOut 让目标动作赋予回力,且以目标动作开始和结束位置赋予弹性, 参数:目标动作
// sister1->runAction(CCEaseElasticInOut::create(CCMoveTo::create(3, ccp(800, 500))));
// CCEaseExponentialIn 让目标动作缓慢开始, 参数:目标动作
// sister1->runAction(CCEaseExponentialIn::create(CCMoveTo::create(3, ccp(800, 500))));
// CCEaseExponentialOut 让目标动作缓慢结束, 参数:目标动作
// sister1->runAction(CCEaseExponentialOut::create(CCMoveTo::create(3, ccp(800, 500))));
// CCEaseExponentialInOut 让目标动作缓慢开始和结束, 参数:目标动作
// sister1->runAction(CCEaseExponentialInOut::create(CCMoveTo::create(3, ccp(800, 500))));
// CCEaseRateAction 让目标动作设置速率, 参数1:目标动作, 参数2:速率
// sister1->runAction(CCEaseRateAction::create(CCMoveTo::create(4, ccp(800, 500)), 5));
// CCEaseSineIn 动作由慢到快, 参数:目标动作
// sister1->runAction(CCEaseSineIn::create(CCMoveTo::create(3, ccp(800, 500))));
// CCEaseSineOut 动作由快到慢, 参数:目标动作
// sister1->runAction(CCEaseSineOut::create(CCMoveTo::create(3, ccp(800, 500))));
// CCEaseSineInOut 动作由慢到快再快到慢, 参数:目标动作
// sister1->runAction(CCEaseSineInOut::create(CCMoveTo::create(3, ccp(800, 500))));
// CCSpawn
// 作用:让多个动作同时执行
// 参数:目标动作的可变参数
/*
CCActionInterval * move = CCMoveTo::create(10, ccp(500,500));
CCActionInterval * scale = CCScaleTo::create(2, 3);
CCActionInterval * rotate = CCRotateTo::create(4, 190);
CCFiniteTimeAction * spawn =CCSpawn::create(move,scale,rotate,NULL);
sister1->runAction(spawn);
*/
// CCSequence
// 作用:让多个动作按照前后顺序逐一执行
// 参数:目标动作的可变参数
/*
CCActionInterval * move = CCMoveTo::create(2, ccp(500,500));
CCActionInterval * scale = CCScaleTo::create(2, 3);
CCFiniteTimeAction * seq= CCSequence::create(move,scale,NULL);
sister1->runAction(seq);
*/
// 扩展如果要对目标动作全部进行方向运动,可以使用如下形式操作
/*
CCFiniteTimeAction *seq = CCSequence::create(CCMoveBy::create(2, ccp(500,500)), CCScaleBy::create(2, 3), NULL);
CCFiniteTimeAction * reverseseq = CCSequence::create(seq,seq->reverse(),NULL);
*/
// 注意CCSequence中的所有动作都必须支持reverse函数,否则会出现异常
/*
CCActionInterval * move = CCMoveBy::create(2, ccp(500,500));
CCActionInterval * scale = CCScaleBy::create(2, 3);
CCFiniteTimeAction * seq= CCSequence::create(move,scale,NULL);
CCFiniteTimeAction * reveseseq = CCSequence::create(seq,seq->reverse(),NULL);
sister1->runAction(reveseseq);
*/
// CCRepeat
// 作用:对目标动作进行重复运动(目标动作可以是CCSequence ,CCSpawn)
// 参数1:目标动作
// 参数2:重复次数
/*
CCActionInterval * move = CCMoveTo::create(2, ccp(500,500));
CCActionInterval * move2 = CCMoveTo::create(2, ccp(100,100));
CCFiniteTimeAction*seq =CCSequence::create(move,move2,NULL);
CCFiniteTimeAction *repeat = CCRepeat::create(seq, 3);
sister1->runAction(repeat);
*/
// CCRepeatForever
// 作用:对目标动作进行永久性的重复运动(目标动作可以是CCSequence ,CCSpawn)
// 参数:目标动作
/*
CCActionInterval * move = CCMoveTo::create(1, ccp(500,500));
CCActionInterval * move1 = CCMoveTo::create(1, ccp(100,100));
CCFiniteTimeAction* seq = CCSequence::create(move,move1,NULL);
CCActionInterval * repeatForever =CCRepeatForever::create((CCActionInterval* )seq);
sister1->runAction(repeatForever);
*/
// 关于回调部分, 再次就不写了
return true;
}
void HelloWorld::backCallfunc(CCNode* node) {
if (!node)
return;
CCSprite* sp = (CCSprite*) node;
if (!m_backStatus) {
sp->setVisible(false);
m_backStatus = 1;
} else {
sp->setVisible(true);
m_backStatus = 0;
}
}
void HelloWorld::frontCallfunc(CCNode* node) {
if (!node)
return;
CCSprite* sp = (CCSprite*) node;
if (!m_frontStatus) {
sp->setVisible(true);
m_frontStatus = 1;
} else {
sp->setVisible(false);
m_frontStatus = 0;
}
}
另外介绍两个cocos2d-x超级大牛: 子龙山人和 红孩儿, 子龙山人的上百度一搜就能搜到, 关于红孩儿的, 由于这个名字比较火, 不好找, 在此介绍下:
红孩儿的博客 Cocos2d-x 2.0 之 Actions “三板斧”, 网址:http://blog.youkuaiyun.com/honghaier, 这里里面详细解释了 动作所有类.