首页 > 代码库 > cocos2d-x ios游戏开发初认识(七) 简单的动画

cocos2d-x ios游戏开发初认识(七) 简单的动画

前面有一节说了帧动画,就是让精灵改变自己的位置、形状、大小来实现相应的动作,这讲主要是要通过一些方法来实现精灵的移动,产生各种炫丽的动画,也可能让你找到一点游戏场景。

下面具体根据代码分析:

为了清晰最好将前几节的代码注释掉。

    //根据前面的知识先创建一个菜单

    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秒增加 x300 y不变

    CCJumpBy *by =CCJumpBy::create(2,ccp(100,0),200, 1);//2秒钟内跳到xy(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的定义

typedefvoid (CCObject::*SEL_CallFunc)(); 由此看出SEL_CallFunc 是个函数指针 指向一个没有函数参数 函数的返回值为void的函数

下面就定义一个这样的函数:

.h文件:

class MainScene:publicCCLayer {

private:

   void onCallFun();               //动画执行完回掉函数

.cpp文件 函数的实现:

voidMainScene::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 被打印出来。。。