动画

新建工程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;

    }

    else if(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;

}


void HelloWorld::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);

}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值