今天我们主要来介绍一下一些知识:
顺序动作:(CCSequence)
组合动作:(CCSpawn)
样条曲线动作:(CCCardinalSplineTo)
贝塞尔曲线动作:(CCBezierTo、CCBezierBy)
反转动作:(Reverse)
持续性动作:(CCRepeat、CCRepeatForever)
停顿动作:(CCDelayTime)
回调动作:(CCCallFuncN)
动画:(CCAnimation)
顺序动作:(CCSequence)
OK,解释一下,顺序动作就像是数组,它将执行一组动画,是按先后顺序来执行的,比如 我们需要精灵先旋转
在移动
在缩小
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCSprite* pSprite= CCSprite::create("Icon.png");
pSprite->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
this->addChild(pSprite);
CCActionInterval* pCCRotateTo= CCRotateTo::create(2.0f,50,0);
CCActionInterval* pCCMoveTo=CCMoveTo::create(2.0f,ccp(visibleSize.width/2+100,visibleSize.height/2));
CCActionInterval* pCCScaleTo= CCScaleTo::create(2.0f,0.5,0.5);
pSprite->runAction(CCSequence::create(pCCRotateTo,pCCMoveTo,pCCScaleTo,NULL));
我们创建了三个动画,分别是旋转 移动 缩放
最后我们在执行动作的时候用CCSequence包装了一下
它将按照我们的顺序依次执行
OK
现在我们想让这三个动画同时执行怎么办呢?
这就要用我们的组合动画CCSpawn了 其实就是把上面的代码中CCSequence换一下就可以了
组合动作:(CCSpawn)
CCActionInterval* pCCRotateTo= CCRotateTo::create(2.0f,50,0);
CCActionInterval* pCCMoveTo=CCMoveTo::create(2.0f,ccp(visibleSize.width/2+100,visibleSize.height/2));
CCActionInterval* pCCScaleTo= CCScaleTo::create(2.0f,0.5,0.5);
//pSprite->runAction(CCSequence::create(pCCRotateTo,pCCMoveTo,pCCScaleTo,NULL));
pSprite->runAction(CCSpawn::create(pCCRotateTo,pCCMoveTo,pCCScaleTo,NULL));
样条曲线动作:(CCCardinalSplineTo)
样条曲线动作又是神马呢??就是我们自定义了自己的路径,它将会缘着我们定义的路径进行运动,还是先看看代码吧,效果图就不贴了,自己可以测试一下
<span style="white-space:pre"> </span>//创建一个点数组
//这里的参数貌似没什么用,超过了容量也不越界
CCPointArray* pPointArray= CCPointArray::create(3);
pPointArray->addControlPoint(ccp(150,150));
pPointArray->addControlPoint(ccp(150,250));
pPointArray->addControlPoint(ccp(350,250));
pPointArray->addControlPoint(ccp(350,150));
pPointArray->addControlPoint(ccp(150,150));
//参数1:延时时间
//参数2:自定义位置点的数组
//参数3:相邻两点的弧度(0表示没有弧度,负数凹弧,正数凸弧度)
CCActionInterval* pCCCardinalSplineTo=CCCardinalSplineTo::create(5.0f,pPointArray,0);
pSprite->runAction(pCCCardinalSplineTo);
贝塞尔曲线动作:(CCBezierTo、CCBezierBy)
//结构体:贝塞尔曲线的配置结构体
ccBezierConfig bezier;
//贝塞尔的起点
bezier.controlPoint_1 = ccp(100, visibleSize.height/2);
//贝塞尔的控制点
bezier.controlPoint_2 = ccp(200, -visibleSize.height/2);
//贝塞尔的结束点
bezier.endPosition = ccp(240,160);
//这里不解释了
CCActionInterval* pCCBezierTo = CCBezierTo::create(2, bezier);
pSprite->runAction(pCCBezierTo);
反转动作:(Reverse)
CCActionInterval* pCCMoveBy= CCMoveBy::create(2.0f,ccp(350,50));
//反转
//这里注意了,CCMoveBy才有reverse CCMoveTo没有
//具体有莫有请按F12
CCActionInterval* pCCMoveByReverse= pCCMoveBy->reverse();
pSprite->runAction(CCSequence::create(pCCMoveBy,pCCMoveByReverse,NULL));
我们找到了CCMoveTo和CCMoveBy的头文件
发现By重写了reverse而To没有
我估计其他的动作也是这样的,你们自己可以在跟踪一下
我说呢,怎么我刚刚用MoveTo反正总是没用
持续性动作:(CCRepeat、CCRepeatForever)
持续性动作就是可以重复一组动作执行的次数,或者无限次的执行下去
我们来做个试验,
1.我们创建一个精灵设置初始位置在(50,160)
2.我们采用MoveBy移动到(350,0) 注意By和To的区别
3.然后反转
4.使用顺序性动作封装
5.在用持续性动作封装
6.执行
CCSprite* pSprite1= CCSprite::create("Icon.png");
pSprite1->setPosition(ccp(50,160));
this->addChild(pSprite1);
//采用MoveBy移动到(350,0)
CCActionInterval* pMoveBy= CCMoveBy::create(1.5f,ccp(350,0));
//然后反转
CCActionInterval* pMoveByReverse= pMoveBy->reverse();
//使用顺序性动作封装
CCActionInterval* pSequence=CCSequence::create(pMoveBy,pMoveByReverse,NULL);
//在用持续性动作封装
//1.指定次数执行,这里将执行3次后停止
//CCActionInterval* pRepeat=CCRepeat::create(pSequence,3);
//2.无限次数执行,永不停止
CCActionInterval* pRepeatForever=CCRepeatForever::create(pSequence);
pSprite1->runAction(pRepeatForever);
停顿动作:(CCDelayTime)
我们来做另外一件有趣的事情,
1.我们创建一个精灵设置初始位置在(50,160)
2.我们采用MoveBy移动到(170,0)
3.然后停顿1秒
4.在移动(170,0)
CCSprite* pSprite1= CCSprite::create("Icon.png");
pSprite1->setPosition(ccp(50,160));
this->addChild(pSprite1);
//采用MoveBy移动到(170,0)
CCActionInterval* pMoveBy= CCMoveBy::create(1.5f,ccp(170,0));
//停顿一秒
CCActionInterval* pDelayTime=CCDelayTime::create(1);
//在移动到(170,0)
CCActionInterval* pMoveBy1= CCMoveBy::create(1.5f,ccp(170,0));
//使用顺序性动作封装
CCActionInterval* pSequence=CCSequence::create(pMoveBy,pDelayTime,pMoveBy1,NULL);
pSprite1->runAction(pSequence);
内容有点多了,今天就到此为止吧,明天把剩下的再介绍完,动作这章基本就差不多了
赶脚不实战总是学的不扎实.....
附上今天的代码
#include "HelloWorldScene.h"
USING_NS_CC;
CCScene* HelloWorld::scene()
{
// 'scene' is an autorelease object
CCScene *scene = CCScene::create();
// 'layer' is an autorelease object
HelloWorld *layer = HelloWorld::create();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
}
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
//
// 1. super init first
if ( !CCLayer::init() )
{
return false;
}
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCSprite* pSprite= CCSprite::create("Icon.png");
pSprite->setPosition(ccp(50,50));
this->addChild(pSprite);
//CCActionInterval* pCCRotateTo= CCRotateTo::create(2.0f,50,0);
//CCActionInterval* pCCMoveTo=CCMoveTo::create(2.0f,ccp(visibleSize.width/2+100,visibleSize.height/2));
//CCActionInterval* pCCScaleTo= CCScaleTo::create(2.0f,0.5,0.5);
pSprite->runAction(CCSequence::create(pCCRotateTo,pCCMoveTo,pCCScaleTo,NULL));
//pSprite->runAction(CCSpawn::create(pCCRotateTo,pCCMoveTo,pCCScaleTo,NULL));
创建一个点数组
这里的参数貌似没什么用,超过了容量也不越界
//CCPointArray* pPointArray= CCPointArray::create(3);
//pPointArray->addControlPoint(ccp(150,150));
//pPointArray->addControlPoint(ccp(150,250));
//pPointArray->addControlPoint(ccp(350,250));
//pPointArray->addControlPoint(ccp(350,150));
//pPointArray->addControlPoint(ccp(150,150));
参数1:延时时间
参数2:自定义位置点的数组
参数3:相邻两点的弧度(0表示没有弧度,负数凹弧,正数凸弧度)
//CCActionInterval* pCCCardinalSplineTo=CCCardinalSplineTo::create(5.0f,pPointArray,0);
//pSprite->runAction(pCCCardinalSplineTo);
结构体:贝塞尔曲线的配置结构体
//ccBezierConfig bezier;
// //贝塞尔的起点
//bezier.controlPoint_1 = ccp(100, visibleSize.height/2);
贝塞尔的控制点
// bezier.controlPoint_2 = ccp(200, -visibleSize.height/2);
贝塞尔的结束点
// bezier.endPosition = ccp(240,160);
这里不解释了
// CCActionInterval* pCCBezierTo = CCBezierTo::create(2, bezier);
//pSprite->runAction(pCCBezierTo);
//CCActionInterval* pCCMoveBy= CCMoveBy::create(2.0f,ccp(350,50));
反转
这里注意了,CCMoveBy才有reverse CCMoveTo没有
具体有莫有请按F12
// CCActionInterval* pCCMoveByReverse= pCCMoveBy->reverse();
// pSprite->runAction(CCSequence::create(pCCMoveBy,pCCMoveByReverse,NULL));
//CCSprite* pSprite1= CCSprite::create("Icon.png");
//pSprite1->setPosition(ccp(50,160));
//this->addChild(pSprite1);
采用MoveBy移动到(350,0)
//CCActionInterval* pMoveBy= CCMoveBy::create(1.5f,ccp(350,0));
然后反转
//CCActionInterval* pMoveByReverse= pMoveBy->reverse();
使用顺序性动作封装
//CCActionInterval* pSequence=CCSequence::create(pMoveBy,pMoveByReverse,NULL);
在用持续性动作封装
1.指定次数执行,这里将执行3次后停止
CCActionInterval* pRepeat=CCRepeat::create(pSequence,3);
2.无限次数执行,永不停止
// CCActionInterval* pRepeatForever=CCRepeatForever::create(pSequence);
//pSprite1->runAction(pRepeatForever);
//CCSprite* pSprite1= CCSprite::create("Icon.png");
//pSprite1->setPosition(ccp(50,160));
//this->addChild(pSprite1);
采用MoveBy移动到(170,0)
//CCActionInterval* pMoveBy= CCMoveBy::create(1.5f,ccp(170,0));
停顿一秒
//CCActionInterval* pDelayTime=CCDelayTime::create(1);
在移动到(170,0)
//CCActionInterval* pMoveBy1= CCMoveBy::create(1.5f,ccp(170,0));
使用顺序性动作封装
//CCActionInterval* pSequence=CCSequence::create(pMoveBy,pDelayTime,pMoveBy1,NULL);
//pSprite1->runAction(pSequence);
return true;
}