Skip to main content

handling multiple sprite animation in cocos2dx3.2

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

//
//  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;
spriteSheetspriteSheet:: 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

Popular posts from this blog

Better Memory management with PixiJS or How to manage cpu and cpu memory in PixiJS.

PixiJS is my favorite framework when i am looking for a web games specially for mobile or desktop  PixiJS is fast blazing fast and you can get a decent FPS even on older device.   so here is my optimization techniques for PixiJs 1. manage your sprites in a better way use spritesheet to reduce the draw calls create big sprite sheet which contain multiple sprites can be draw in gpu with a single draw call. use TexturePacker  https://www.codeandweb.com/texturepacker  best tool when its comes to spritesheet 2. for floating point calculation round off calculation for example let  speed = 0.75 ; let  position = 100 ; console . log ( Math . round ( speed * position )) 3. don't create very big canvas when u need a big canvas size game just try to create a small canvas and translate it. 4. its very important one managing TextureCache in memory you can get all TextureCache list by using  Object.entries(PIXI.utils.TextureCache); so even you use ap...

adding particles Effect in pixijs using https://pixijs.io/pixi-particles-editor/

adding particle in pixijs is very easy using the below tool more information can be found below https://github.com/pixijs/pixi-particles https://pixijs.io/pixi-particles-editor/ required packages  /// < reference path = "node_modules/pixi-particles/ambient.d.ts" /> import 'pixi-particles' code of particle delcare a     global variable   private emitter ?: Emitter ; const img = PIXI . Texture . from ( "./assets/images/particle.png" ); this . emitter = new Emitter ( this ,[ img ],{ "alpha" : { "start" : 0.62 , "end" : 0.39 }, "scale" : { "start" : 0.1 , "end" : 0.9 , "minimumScaleMultiplier" : 1.25 }, "color" : { "start" : "#ffff8f" , "end" : ...