Cocos2D-X2.2.3学习笔记14(延时动作)

今天我们主要来介绍一下一些知识:

顺序动作:(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值