好了它的优点和作用就说到这吧,肯定还有很多,我也就不知道了。
关于单例的问题大家可以看看这篇文章 http://www.zilongshanren.com/cocos2d-x-design-pattern-singleton1/ |
回到主题,首先我们粘贴一段代码。
在魔塔的源代码中有一个单例类的模板,无脑的复制黏贴,这个模板是动画管理器AnimationManager的基类,这个有什么用呢,其实用处很简单就是一个单例的模板让继承他的子类都变成单例模式,下次再做别的游戏时用到直接继承,多方便。当然你也可以不用这个模板,直接让AnimationManager变成单例类。
#ifndef _SINGLETON_H #define _SINGLETON_H template <class T> class Singleton { public: //获取类的唯一实例 static inline T* instance(); //释放类的唯一实例 void release(); protected: Singleton(void){} ~Singleton(void){} static T* _instance; }; template <class T> inline T* Singleton<T>::instance() { if(!_instance) _instance = new T; return _instance; } template <class T> void Singleton<T>::release() { if (!_instance) return; delete _instance; _instance = 0; } //cpp文件中需要先声明静态变量 #define DECLARE_SINGLETON_MEMBER(_Ty) \ template <> _Ty* Singleton<_Ty>::_instance = NULL; #endif//_SINGLETON_H
注意: 1.子类要在子类的cpp文件开始写上DECLARE_SINGLETON_MEMBER(子类的名字) 2.子类最好写上构造和析构函数 |
#ifndef _ANIMATION_MANAGER_H_ #define _ANIMATION_MANAGER_H_ #include "cocos2d.h" #include "Singleton.h" #include "type.h" using namespace cocos2d; class AnimationManager : public Singleton<AnimationManager> { public: AnimationManager(); ~AnimationManager(); //初始化动画模版缓存表 bool initAnimationMap(); //根据名字得到一个动画模板 CCAnimation* getAnimation(int key); //创建一个动画实例 CCAnimate* createAnimate(int key); //创建一个动画实例 CCAnimate* createAnimate(const char* key); //清空所有缓存 void releaseAllCacha(); protected: //加载勇士行走动画模版 CCAnimation* createAnimationByDirection(HeroDirection direction); }; //定义动画管理器实例的别名 #define sAnimationMgr AnimationManager::instance() #endif
#include "AnimationManager.h" DECLARE_SINGLETON_MEMBER(AnimationManager); AnimationManager::AnimationManager() { } AnimationManager::~AnimationManager() { } bool AnimationManager::initAnimationMap() { bool sRet = false; do { //1.添加图片进内存 CCTexture2D * creepTexture = CCTextureCache::sharedTextureCache()->addImage("boy.png"); CC_BREAK_IF(!creepTexture); //2.加载各个方向的敌人动画 char temp[20]; sprintf(temp, "%d", aDown); //加载勇士向下走的动画 CCAnimationCache::sharedAnimationCache()->addAnimation(createAnimationByDirection(kDown), temp); sprintf(temp, "%d", aRight); //加载勇士向右走的动画 CCAnimationCache::sharedAnimationCache()->addAnimation(createAnimationByDirection(kRight), temp); sprintf(temp, "%d", aLeft); //加载勇士向左走的动画 CCAnimationCache::sharedAnimationCache()->addAnimation(createAnimationByDirection(kLeft), temp); sprintf(temp, "%d", aUp); //加载勇士向上走的动画 CCAnimationCache::sharedAnimationCache()->addAnimation(createAnimationByDirection(kUp), temp); sRet = true; } while (0); return sRet; } CCAnimation* AnimationManager::getAnimation( int key ) { char temp[20]; sprintf(temp, "%d", key); return CCAnimationCache::sharedAnimationCache()->animationByName(temp); } CCAnimate* AnimationManager::createAnimate( int key ) { //获取指定动画模版 CCAnimation* anim = getAnimation(key); if(anim) { //根据动画模版生成一个动画实例 // return cocos2d::CCAnimate::actionWithAnimation(anim); return cocos2d::CCAnimate::create(anim); } return NULL; } CCAnimate* AnimationManager::createAnimate( const char* key ) { //获取指定动画模版 CCAnimation* anim = CCAnimationCache::sharedAnimationCache()->animationByName(key); if(anim) { //根据动画模版生成一个动画实例 return cocos2d::CCAnimate::create(anim); } return NULL; } CCAnimation* AnimationManager::createAnimationByDirection( HeroDirection direction ) { //3.生产剪切动画 CCTexture2D * creepTexture=CCTextureCache::sharedTextureCache()->textureForKey("boy.png"); CCSpriteFrame *frame0, *frame1, *frame2, *frame3; frame0 = CCSpriteFrame::createWithTexture(creepTexture, cocos2d::CCRectMake(47*0, 95*direction, 47, 95)); frame1 = CCSpriteFrame::createWithTexture(creepTexture, cocos2d::CCRectMake(47*1, 95*direction, 47, 95)); frame2 = CCSpriteFrame::createWithTexture(creepTexture, cocos2d::CCRectMake(47*2, 95*direction, 47, 95)); frame3 = CCSpriteFrame::createWithTexture(creepTexture, cocos2d::CCRectMake(47*3, 95*direction, 47, 95)); CCArray * animFrames = new CCArray(4); animFrames->addObject(frame0); animFrames->addObject(frame1); animFrames->addObject(frame2); animFrames->addObject(frame3); CC_SAFE_RETAIN(animFrames); CCAnimation * animation= CCAnimation::createWithSpriteFrames(animFrames,0.5f); animFrames->release(); return animation; } void AnimationManager::releaseAllCacha() { }
建立完这个动画管理单例后,用法也是很简单,只需要调用那几个getXXXX 就行,当然这个动画管理器功能还比较简单,因为我是个新手所以不能一下吧所有的功能都写上,还是先用到哪些写那些。
之后我们在建立一个单例类,来保存一些全局数据
HWorld.h
#ifndef __HWORLD_H__ #define __HWORLD_H__ #include "cocos2d.h" #include "type.h" #include "Singleton.h" using namespace cocos2d; class HWorld: public Singleton<HWorld> { public: HWorld(); ~HWorld(); //初始化 bool initHWorld(); //清空所有缓存 void releaseAll(); public: //路点数组 CCPointArray * _wayPoint; }; //定义动画管理器实例的别名 #define sHWorld HWorld::instance() #endif
HWorld.cpp
#include "HWorld.h" DECLARE_SINGLETON_MEMBER(HWorld); bool HWorld::initHWorld() { return true; } void HWorld::releaseAll() { } HWorld::HWorld() { } HWorld::~HWorld() { }
目前这个类里面之后一个路点的数组,这个数组中保存了地图上需要转弯地方的坐标,其他的东西以后再添加。
当然还有我们的枚举,把它放在一个.h文件中,方便查看
type.h
#ifndef __TYPE_H__ #define __TYPE_H__ typedef enum { kDown = 0,//向下方向 kLeft = 1,//向左方向 kRight= 2,//向右方向 kUp = 3,//向上方向 kNormal, } HeroDirection;//勇士方向 typedef enum { aDown = 0,//向下行走动画 aLeft,//向左行走动画 aRight,//向右行走动画 aUp,//向上行走动画 aFight,//刀光动画 } AnimationKey;//动画模版键值 //定义怪物的类型 typedef enum { kHighBlood=0,//高血量怪物 kQuick = 1, }CreepType; //----------------定义一个creep中所用到的tag-------- typedef enum { kSprite =0,//精灵的标签 kSpeedAction = 1,//控制速度的action所用的标签 kFoveverAction = 2,//控制精灵帧的action标签 }CreepTag; enum { kZMap = 0,//地图的zOrder kZNPC, kZTeleport, kZHero,//勇士精灵的zOrder kZTip,//提示信息的zOrder };//GameLayer中各部分的显示zOrder及tag #endif
好了,生成一下。
下一篇会让我们的敌人动起来
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。