前面有一节说了帧动画,就是让精灵改变自己的位置、形状、大小来实现相应的动作,这讲主要是要通过一些方法来实现精灵的移动,产生各种炫丽的动画,也可能让你找到一点游戏场景。
下面具体根据代码分析:
为了清晰最好将前几节的代码注释掉。
//根据前面的知识先创建一个菜单
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 被打印出来。。。
cocos2d-x ios游戏开发初认识(七) 简单的动画,布布扣,bubuko.com