代码出自魔塔

使用方法在代码后几行

//**********animation.h************** #ifndef_ANIMATION_MANAGER_H_ #define_ANIMATION_MANAGER_H_ #include"MTGame.h" usingnamespacecocos2d; //地方写的有点不太对,写在一个全局变量里比较好 typedefenum{ kDown=0,//向下方向 kLeft=1,//向左方向 kRight=2,//向右方向 kUp=3,//向上方向 kNormal, }HeroDirection;//勇士方向 typedefenum{ kNone=1,//可以通行 kWall,//墙 kEnemy,//敌人 kItem,//物品 kDoor,//门 kNPC,//npc kTeleport,//传送点 }CollisionType;//碰撞类型 typedefenum{ aDown=0,//向下行走动画 aLeft,//向左行走动画 aRight,//向右行走动画 aUp,//向上行走动画 aFight,//刀光动画 }AnimationKey;//动画模版键值 classAnimationManager:publicSingleton<AnimationManager> { public: AnimationManager(); ~AnimationManager(); //初始化动画模版缓存表 boolinitAnimationMap(); //根据名字得到一个动画模板 CCAnimation*getAnimation(intkey); //创建一个动画实例 CCAnimate*createAnimate(intkey); //创建一个动画实例 CCAnimate*createAnimate(constchar*key); protected: //加载勇士行走动画模版 CCAnimation*createHeroMovingAnimationByDirection(HeroDirectiondirection); CCAnimation*createFightAnimation(); CCAnimation*createNPCAnimation(); }; //定义动画管理器实例的别名 #definesAnimationMgrAnimationManager::instance() #endif //*********************animation.cpp************************** #include"AnimationManager.h" DECLARE_SINGLETON_MEMBER(AnimationManager); AnimationManager::AnimationManager() { } AnimationManager::~AnimationManager() { //CCDirector会自己清除AnimationCache //CCAnimationCache::purgeSharedAnimationCache(); } boolAnimationManager::initAnimationMap() { chartemp[20]; sprintf(temp,"%d",aDown); //加载勇士向下走的动画 CCAnimationCache::sharedAnimationCache()->addAnimation(createHeroMovingAnimationByDirection(kDown),temp); sprintf(temp,"%d",aRight); //加载勇士向右走的动画 CCAnimationCache::sharedAnimationCache()->addAnimation(createHeroMovingAnimationByDirection(kRight),temp); sprintf(temp,"%d",aLeft); //加载勇士向左走的动画 CCAnimationCache::sharedAnimationCache()->addAnimation(createHeroMovingAnimationByDirection(kLeft),temp); sprintf(temp,"%d",aUp); //加载勇士向上走的动画 CCAnimationCache::sharedAnimationCache()->addAnimation(createHeroMovingAnimationByDirection(kUp),temp); //加载战斗动画 sprintf(temp,"%d",aFight); CCAnimationCache::sharedAnimationCache()->addAnimation(createFightAnimation(),temp); //加载NPC动画 CCAnimationCache::sharedAnimationCache()->addAnimation(createNPCAnimation(),"npc0"); returntrue; } CCAnimation*AnimationManager::createHeroMovingAnimationByDirection(HeroDirectiondirection) { CCTexture2D*heroTexture=CCTextureCache::sharedTextureCache()->addImage("hero.png"); CCSpriteFrame*frame0,*frame1,*frame2,*frame3; //第二个参数表示显示区域的x,y,width,height,根据direction来确定显示的y坐标 frame0=CCSpriteFrame::frameWithTexture(heroTexture,cocos2d::CCRectMake(32*0,32*direction,32,32)); frame1=CCSpriteFrame::frameWithTexture(heroTexture,cocos2d::CCRectMake(32*1,32*direction,32,32)); frame2=CCSpriteFrame::frameWithTexture(heroTexture,cocos2d::CCRectMake(32*2,32*direction,32,32)); frame3=CCSpriteFrame::frameWithTexture(heroTexture,cocos2d::CCRectMake(32*3,32*direction,32,32)); CCMutableArray<CCSpriteFrame*>*animFrames=newCCMutableArray<CCSpriteFrame*>(4); animFrames->addObject(frame0); animFrames->addObject(frame1); animFrames->addObject(frame2); animFrames->addObject(frame3); CCAnimation*animation=newCCAnimation(); //0.05f表示每帧动画间的间隔 animation->initWithFrames(animFrames,0.05f); animFrames->release(); returnanimation; } //创建战斗动画模板 CCAnimation*AnimationManager::createFightAnimation() { //定义每帧的序号 intfightAnim[]= { 4,6,8,10,13,15,17,19,20,22 }; CCMutableArray<CCSpriteFrame*>*animFrames=newCCMutableArray<CCSpriteFrame*>(); CCTexture2D*texture=CCTextureCache::sharedTextureCache()->addImage("sword.png"); CCSpriteFrame*frame; intx,y; for(inti=0;i<10;i++) { //计算每帧在整个纹理中的偏移量 x=fightAnim[i]%5-1; y=fightAnim[i]/5; frame=CCSpriteFrame::frameWithTexture(texture,cocos2d::CCRectMake(192*x,192*y,192,192)); //第17和19帧在y方向上有-8的偏移 if(fightAnim[i]==17||fightAnim[i]==19) { frame->setOffsetInPixels(ccp(0,-8)); } animFrames->addObject(frame); } CCAnimation*animation=newCCAnimation(); animation->initWithFrames(animFrames,0.1f); animFrames->release(); returnanimation; } CCAnimation*AnimationManager::createNPCAnimation() { CCTexture2D*heroTexture=CCTextureCache::sharedTextureCache()->addImage("npc.png"); CCSpriteFrame*frame0,*frame1,*frame2,*frame3; //第二个参数表示显示区域的x,y,width,height,根据direction来确定显示的y坐标 frame0=CCSpriteFrame::frameWithTexture(heroTexture,cocos2d::CCRectMake(32*0,0,32,32)); frame1=CCSpriteFrame::frameWithTexture(heroTexture,cocos2d::CCRectMake(32*1,0,32,32)); frame2=CCSpriteFrame::frameWithTexture(heroTexture,cocos2d::CCRectMake(32*2,0,32,32)); frame3=CCSpriteFrame::frameWithTexture(heroTexture,cocos2d::CCRectMake(32*3,0,32,32)); CCMutableArray<CCSpriteFrame*>*animFrames=newCCMutableArray<CCSpriteFrame*>(4); animFrames->addObject(frame0); animFrames->addObject(frame1); animFrames->addObject(frame2); animFrames->addObject(frame3); CCAnimation*animation=newCCAnimation(); //0.05f表示每帧动画间的间隔 animation->initWithFrames(animFrames,0.2f); animFrames->release(); returnanimation; } //获取指定动画模版 CCAnimation*AnimationManager::getAnimation(intkey) { chartemp[20]; sprintf(temp,"%d",key); returnCCAnimationCache::sharedAnimationCache()->animationByName(temp); } //获取一个指定动画模版的实例 CCAnimate*AnimationManager::createAnimate(intkey) { //获取指定动画模版 CCAnimation*anim=getAnimation(key); if(anim) { //根据动画模版生成一个动画实例 returncocos2d::CCAnimate::actionWithAnimation(anim); } returnNULL; } //获取一个指定动画模版的实例 CCAnimate*AnimationManager::createAnimate(constchar*key) { //获取指定动画模版 CCAnimation*anim=CCAnimationCache::sharedAnimationCache()->animationByName(key); if(anim) { //根据动画模版生成一个动画实例 returncocos2d::CCAnimate::actionWithAnimation(anim); } returnNULL; } //***********************调用animationManager的方法 //从动画管理器中根据npcId获取动画,开始永久播放 CCAnimate*animation=sAnimationMgr->createAnimate(npcId->m_sString.c_str()); if(animation!=NULL){ CCActionInterval*action=CCRepeatForever::actionWithAction(animation); npcSprite->runAction(action); } //////////////////////////////////////////////////////////////// //**************************动画管理器的使用************************************** //////////////////////////////////////////////////////////////////////////////// //***************第一步:appdelegate,中的初始化的方法************* boolAppDelegate::applicationDidFinishLaunching() { CCDirector*pDirector=CCDirector::sharedDirector(); pDirector->setOpenGLView(&CCEGLView::sharedOpenGLView()); pDirector->setDeviceOrientation(kCCDeviceOrientationLandscapeLeft); pDirector->setDisplayFPS(true); pDirector->setAnimationInterval(1.0/60); //初始化动画管理器 sAnimationMgr->initAnimationMap(); //创建游戏主界面 CCScene*pScene=GameScene::playNewGame(); //让director运行场景 pDirector->runWithScene(pScene); returntrue; } //*******************最后一步:释放动画管理器********************** AppDelegate::~AppDelegate() { SimpleAudioEngine::end(); //释放动画管理器 sAnimationMgr->release(); } //******************************第二步:使用方法*********************************** //**************初始化一个精灵1******************** //用模板初始化一个精灵 boolHero::heroInit() { heroSprite=CCSprite::spriteWithSpriteFrame(sAnimationMgr->getAnimation(kDown)->getFrames()->getObjectAtIndex(0)); } //********************使用方法2****************************** //例子1 heroSprite->runAction(sAnimationMgr->createAnimate(direction)); //例子2 CCAction*action=CCSequence::actions( sAnimationMgr->createAnimate(aFight), CCCallFuncN::actionWithTarget(this,callfuncN_selector(Hero::onFightDone)), NULL); //例子3 //从动画管理器中根据npcId获取动画,开始永久播放 CCAnimate*animation=sAnimationMgr->createAnimate(npcId->m_sString.c_str()); if(animation!=NULL){ CCActionInterval*action=CCRepeatForever::actionWithAction(animation); npcSprite->runAction(action); }