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

Creating a word Scramble game where you can drag and drop the word and create a complete word. (drag and drop word Scramble game).

Creating a word game using  phaser game engine which is a javascript based gaming engine  where u can drag and drop world like Word Scramble Game and complete a given word. your index.html file look like below < html > < head > < script src = "src/phaser.min.js" ></ script > < script src = "src/wordGame.js" ></ script > < script src = "src/main.js" ></ script > </ head > < body > </ body > </ html > 1.    <script src="src/phaser.min.js"></script> required to run the  phaser game engine. 2. rest of the two files deals with game logics      <script src="src/wordGame.js"></script>       <script src="src/main.js"></script> you can download whole project from https://github.com/manishchauhan/wordgame/tree/master just copy and paste the project in your local server and run ...

starting with three.js and react with a very simple example

 1. three.js is undoubtedly the best library to create interactive content for the web in 3d. link https://threejs.org/ a working sample of three with react can be found below https://stackblitz.com/edit/react-7n5qf9?file=src%2FApp.js why choose threejs 1. lightweight  2.fast 3.big community  https://discourse.threejs.org/ 4. even you can use unity or unreal to publish html5 content but i don't think that would be acceptable in many cases. 5. open-source project. i created a running sample with React  https://stackblitz.com/edit/react-7n5qf9?file=src%2FApp.js

A simple binary search tree with generic approach tree can store any type of data. (DFS and BFS)

 1. a binary search tree in c++ using a generic approach with both BFS and DFS approach    working tree    https://www.onlinegdb.com/edit/HkuQLdA-w code=> some properties of binary search tree-> 1. binary search tree is not always a balanced tree.  2. Inorder, traversing gives you sorted data.  3.  best is o(log n) and worst is O(n).  4. left node data is always less than root data and right node data always be greater than root data.  5. red-black tree STL map is a balanced binary search tree. *******************************************************************************/ #include <stdio.h> #include<iostream> #include<queue> using namespace std; template < typename T > class Node {   //can store any type of data private:   //genric data or store any type of data   T data;   //reference of left pointer   Node *left = nullptr;   //reference of right pointer   Node *rig...