前面有一节说了帧动画,就是让精灵改变自己的位置、形状、大小来实现相应的动作,这讲主要是要通过一些方法来实现精灵的移动,产生各种炫丽的动画,也可能让你找到一点游戏场景。
下面具体根据代码分析:
为了清晰最好将前几节的代码注释掉。
//根据前面的知识先创建一个菜单
CCMenuItemFont *item =CCMenuItemFont::create("开始游戏",this, menu_selector(MainScene::onMenuItem));//点击事件
//添加到菜单栏里面
CCMenu *menu = CCMenu::create(item,NULL);//可以传多个
menu->setPosition(ccp(100,500));
this->addChild(menu);
//创建一个精灵
sprite = CCSprite::create("Icon-72.png");
sprite->setPosition(ccp(300,300));
this->addChild(sprite);
运行:在onMenuItem函数里实现一些动画:
//1.实现精灵的隐藏
CCHide *hide =CCHide::create(); //隐藏精灵
sprite->runAction(hide); //运行动画
运行 点击开始游戏:发现精灵隐藏了,这里有很多动画都可以去尝试
CCHide *hide =CCHide::create(); //隐藏精灵
CCFadeTo *to = CCFadeTo::create(2,0); //0~255 淡入淡出用时2s
CCMoveTo *toto = CCMoveTo::create(2,ccp(500, 300)); //移动到某个点用时2s
CCMoveBy *toby = CCMoveBy::create(2,ccp(300, 0)); //2秒增加 x加300 y不变
CCJumpBy *by =CCJumpBy::create(2,ccp(100,0), 200, 1);//2秒钟内跳到x,y为(300,0)的位置每次会跳200高一共跳30次
sprite->runAction(hide); //运行动画
这些是一些基础的动画 都可以去尝试 截图看不到明显的效果,只要sprite->runAction(hide) 改括号里面内容。//2.实现一个简单的轨迹
轨迹图片:
//实现一个轨迹
CCPointArray *pa =CCPointArray::create(5);//创建一个点数组
pa->addControlPoint(ccp(0,0));
pa->addControlPoint(ccp(100,0)); //向右移动
pa->addControlPoint(ccp(100, -50));//向下移动
pa->addControlPoint(ccp(150, -50));//向右移动
pa->addControlPoint(ccp(150,0)); //向向移动
pa->addControlPoint(ccp(300,0)); //向右移动
CCCardinalSplineBy *spby =CCCardinalSplineBy::create(5, pa,1); //按轨迹移动
sprite->runAction(spby); //运行一个动画
运行://3.实现一个曲线
代码:
//用Bezier实现曲线运动
ccBezierConfig bc;
bc.controlPoint_1 =ccp(400, 400); //控制点1
bc.controlPoint_2 =ccp(800, 200); //控制点2
bc.endPosition =ccp(900, 300); //终点
CCBezierTo *bezie = CCBezierTo::create(3, bc); //传引用
sprite->runAction(bezie); //运行一个动画
运行:自己运行才能看到效果!!!
//4.通过CCSequence 实现组合动画 顺序执行
//用CCSequence实现组合动画 顺序执行
CCMoveTo *tototo = CCMoveTo::create(2,ccp(900, 300));//移动
CCEaseSineIn *in = CCEaseSineIn::create(tototo); //控制速度先慢后快可以加可以不加试试
CCBlink *blink = CCBlink::create(3,10); //闪烁一个动画
CCDelayTime *delay =CCDelayTime::create(2);
CCSequence *sequence = CCSequence::create(in,delay,blink,NULL);//组合动画按顺序执行 先移动 然后延时 最后闪烁
sprite->runAction(sequence); //运行一个动画
运行:自己运行才能看到效果!!!
//5.通过CCSpawn 实现组合动画
并行执行
//并行执行动画
CCMoveTo *totototo = CCMoveTo::create(2, ccp(900, 300));
CCRotateBy *rotate = CCRotateBy::create(2, 3600); //旋转 3600度
CCSpawn *spawn = CCSpawn::create(totototo,rotate,NULL);
sprite->runAction(spawn);
运行:
自己运行才能看到效果!!!
//6.动画执行完毕 可以进行回掉
先看 CCCallFunc 类的创建:
CCCallFunc *func = CCCallFunc::create(this, <#SEL_CallFunc selector#>) SEL_CallFunc的定义
typedef void (CCObject::*SEL_CallFunc)(); 由此看出SEL_CallFunc 是个函数指针 指向一个没有函数参数 函数的返回值为void的函数
下面就定义一个这样的函数:
.h文件:
class MainScene:public CCLayer {
private:
void onCallFun(); //动画执行完 回掉函数
.cpp文件 函数的实现:
void MainScene::onCallFun()
{
CCLOG("action over");
}
只做了一个打印。。下面看回掉的具体实现代码:
//并行执行动画
CCMoveTo *totototo = CCMoveTo::create(2, ccp(900, 300));
CCRotateBy *rotate = CCRotateBy::create(2, 3600); //旋转 3600度
CCSpawn *spawn = CCSpawn::create(totototo,rotate,NULL);
// sprite->runAction(spawn);
//动画执行完后 回掉
CCCallFunc *func = CCCallFunc::create(this, callfunc_selector(MainScene::onCallFun));
CCSequence *seq = CCSequence::create(spawn,func,NULL); //添加到队列
sprite->runAction(seq);
运行:可以看到 当动画执行完后 action over 被打印出来。。。