many times in gaming world we need to handle multiple animation for e.g. when hero is running we have to call running sprite or frames when hero is jumping we need to call jumping frame here is my solution for that
====================
.h file
====================
.h file
//
// spriteSheet.h
// firegame
//
// Created by Manish on 22/03/15.
//
//
#ifndef __firegame__spriteSheet__
#define __firegame__spriteSheet__
#include "cocos2d.h"
class spriteSheet : public cocos2d::SpriteBatchNode
{
public:
//constructor
spriteSheet();
//destructor
~spriteSheet();
static spriteSheet* create(/*spritesheet reference*/std::string __spriteReference,/*plist reference */std::string __plistname,/*first frame of spritesheet*/std::string firstframe);
void initOptions(std::string firstframe);
//function
void addAnimation(/*frame name*/std::string frameName,/*animation name*/std::string AnimationName,/*total frames*/ int totalFrames);
void playanimation(std::string AnimationName,bool loop,float speed,std::string nextAction);
//
std::map<std::string,cocos2d::Vector<cocos2d::SpriteFrame*> > spriteSequences;
void actionFinished();
};
#endif /* defined(__firegame__spriteSheet__) */
.cpp file
//
// spriteSheet.cpp
// firegame
//
// Created by Manish on 22/03/15.
//
//
#include "spriteSheet.h"
using namespace cocos2d;
spriteSheet::spriteSheet() {}
spriteSheet::~spriteSheet() {}
spriteSheet* spriteAnimation;
SpriteFrameCache* spritecache;
Sprite *spriteHolder;
std::string spriteReference;
std::string moveToNext;
Animation *animation;
spriteSheet* spriteSheet:: create(std::string __spriteReference,std::string __plistname,std::string firstframe)
{
spriteAnimation = new spriteSheet();
if (spriteAnimation && spriteAnimation->initWithFile(__spriteReference,1))
{
//release
spriteAnimation->autorelease();
//passing parameters
spriteReference=__spriteReference;
spritecache = SpriteFrameCache::getInstance();
spritecache->addSpriteFramesWithFile(__plistname);
spriteAnimation->initOptions(firstframe);
return spriteAnimation;
}
CC_SAFE_DELETE(spriteAnimation);
return NULL;
}
//add first frame of sprite
void spriteSheet::initOptions(std::string firstframe)
{
spriteHolder = Sprite::createWithSpriteFrameName(firstframe);
spriteAnimation->addChild(spriteHolder);
}
//add a animation
void spriteSheet::addAnimation(/*frame name*/std::string frameName,/*animation name*/std::string AnimationName,/*total frames*/ int totalFrames)
{
std::string keyframe=frameName.append("%01d.png");
Vector<SpriteFrame*> frames(totalFrames);
char str[100] = {0};
for(int i = 1; i <= totalFrames; i++)
{
sprintf(str, keyframe.c_str(), i);
SpriteFrame* frame = spritecache->getSpriteFrameByName(str);
frames.pushBack(frame);
}
spriteSequences[AnimationName].pushBack(frames);
}
//play a animation
void spriteSheet::playanimation(std::string AnimationName,bool loop,float speed,std::string nextAction)
{
if(animation)
{
spriteHolder->stopAllActions();
}
animation = Animation::createWithSpriteFrames(spriteSequences[AnimationName], 1.0f/speed);
if(loop)
{
spriteHolder->runAction(RepeatForever::create( Animate::create(animation) ));
}
else
{
moveToNext=nextAction;
auto callback = CallFunc::create( CC_CALLBACK_0(spriteSheet::actionFinished,this));
auto onlyonce=Sequence::create( Animate::create(animation),callback, nullptr);
spriteHolder->runAction(onlyonce);
}
}
void spriteSheet::actionFinished()
{
if(moveToNext.empty())
{
return;
}
playanimation(moveToNext, true,24.0f,"");
}
//this class batch all animation in a single class and play them when they required
now include this class on your game using
#include "spriteSheet.h"
add a spriteSheet variable
spriteSheet *myhero;
// add more code
//where heroRunning1.png is the first frame of animation
myhero= spriteSheet::create("hero.png", "hero.plist", "heroRunning1.png");
myhero->setPosition(Vec2(600,50));
myhero->setName("Hero");
myhero->addAnimation("heroRunning","run", 15);//add first animation
myhero->addAnimation("heroJumpDown","roll", 20);//add 2 animation
myhero->addAnimation("heroJumpUp","jump", 2);//add 3 animation
//play a animation in loop
myhero->playanimation("run",true,24,"");
//play a animation at single time
myhero->playanimation("jump",false,3,"run");
addChild(myhero);
Comments
Post a Comment