动画

来源:互联网 发布:ubuntu export 编辑:程序博客网 时间:2024/04/27 00:18

新建工程testAnimation

修改HelloWorldScene.h

#ifndef __HELLOWORLD_SCENE_H__

#define __HELLOWORLD_SCENE_H__


#include "cocos2d.h"


class HelloWorld :public cocos2d::CCLayer

{

public:

    // Method 'init' in cocos2d-x returns bool, instead of 'id' in cocos2d-iphone (an object pointer)

   virtual bool init();


    // there's no 'id' in cpp, so we recommend to return the class instance pointer

   static cocos2d::CCScene* scene();

    

    // preprocessor macro for "static create()" constructor ( node() deprecated )

    CREATE_FUNC(HelloWorld);

    //定义一个变量用以标识当前显示的帧下标

   int currentFrameIndex;

   void myUpdate(float dt);

};


#endif // __HELLOWORLD_SCENE_H__

修改HelloWorldScene.cpp

#include "HelloWorldScene.h"

#include "SimpleAudioEngine.h"


using namespace cocos2d;

using namespace CocosDenshion;

#define AnimationMacro 4

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;

    }


    if (AnimationMacro==3) {

        

       CCSprite *sp=CCSprite::create("crop1.png");

        sp->setPosition(ccp(170,200));

       addChild(sp);

        

       CCAnimation *animation=CCAnimation::create();

        animation->addSpriteFrameWithFileName("crop1.png");

        animation->addSpriteFrameWithFileName("crop2.png");

        animation->addSpriteFrameWithFileName("crop3.png");

        animation->addSpriteFrameWithFileName("crop4.png");

        animation->setDelayPerUnit(2.8f/14.0f);//必须设置否则不会动态播放

        animation->setLoops(-1);//重复次数 (-1:无限循环)

       CCFiniteTimeAction *animate=CCAnimate::create(animation);

        sp->runAction(animate);

       return true;

    }

    elseif(AnimationMacro==4)

    {

        CCTexture2D::PVRImagesHavePremultipliedAlpha(true);

        CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("crop.plist");

        

        //利用帧缓存创建精灵

        CCSprite *sp=CCSprite::createWithSpriteFrameName("crop1.png");

        sp->setPosition(ccp(170,200));

       addChild(sp);

        

       CCArray *animFrames=CCArray::createWithCapacity(4);

       char str[100]={0};

       for (int i=1; i<5; i++) {

           sprintf(str,"crop%i.png",i);

            CCSpriteFrame *frame=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(str);

            animFrames->addObject(frame);

        }

       CCAnimation *animation=CCAnimation::createWithSpriteFrames(animFrames,0.3f);

        animation->setLoops(-1);//重复次数 (-1:无限循环)

        sp->runAction(CCAnimate::create(animation));

       return  true;

    }

   CCSprite *frame=NULL;

   CCSprite *frame2=NULL;

   CCSprite *frame3=NULL;

   CCSprite *frame4=NULL;

    

    switch (AnimationMacro) {

       case 1:

        {

            //添加四个小精灵,每个精灵用来表示一帧

            frame=CCSprite::create("crop1.png");

            frame2=CCSprite::create("crop2.png");

            frame3=CCSprite::create("crop3.png");

            frame4=CCSprite::create("crop4.png");


        }

           break;

       case 2:

        {

            frame=CCSprite::create("crop.png",CCRectMake(0,0, 100, 86));

            frame2=CCSprite::create("crop.png",CCRectMake(100,0, 100, 86));

            frame3=CCSprite::create("crop.png",CCRectMake(200,0, 100, 86));

            frame4=CCSprite::create("crop.png",CCRectMake(300,0, 100, 86));

        }

           break;

       default:

           break;

    }

        

    //设置一样的坐标

    frame->setPosition(ccp(100,180));

    frame2->setPosition(ccp(100,180));

    frame3->setPosition(ccp(100,180));

    frame4->setPosition(ccp(100,180));

    

    //设置2-4帧不可见,初始化时只显示第一帧

    currentFrameIndex=0;

    frame2->setVisible(false);

    frame3->setVisible(false);

    frame4->setVisible(false);

    

    //添加到当前层中,tag按照顺序0-3

   addChild(frame,0,0);

   addChild(frame2,0,1);

   addChild(frame3,0,2);

   addChild(frame4,0,3);

    //0.5s调用一次myUpdate(0.5秒切换一帧)

    schedule(schedule_selector(HelloWorld::myUpdate),0.5);

    return true;

}


voidHelloWorld::myUpdate(float dt)

{

    currentFrameIndex++;

    //获取当前所有精灵

   CCArray *array=this->getChildren();

    //为防止下标超过最大tag的精灵

   if (currentFrameIndex>=array->count()) {

        currentFrameIndex=0;

    }

    //隐藏所有精灵

   for (int i=0; i<array->count(); i++) {

        //根据tag索引每一帧并设置不可见

       CCSprite *spT=(CCSprite*)this->getChildByTag(i);

        spT->setVisible(false);

    }

    

    //让下一帧显示出来

    CCSprite *sp=(CCSprite*) array->objectAtIndex(currentFrameIndex);

    sp->setVisible(true);

}


原创粉丝点击