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