cocos2d-x 2x 菜鸟编塔防 01 准备工作
最近在学习2dx,看了几个源码,手很是痒痒,下面跟我一下编写一个类似保卫大萝卜的塔防游戏吧。
二.不废话开始编代码。我用的cocos2d-x 的版本是2.04 ,编辑器是vs2010.首先创建一个工程,我们取名字叫“TDgame”。
之后我们添加几个常用到的模块。
1.动画管理器,AnimationManager类
AnimationManager类这是个单例的类,大家要问这样弄个单例类出来有什么好处呢,有什么作用呢,一开始我也是不明白,最后看了看魔塔的源代码,总结了一下: 实现了一体化,也就是说把所有的动画加载都放到一个函数中,我们可以让这个函数出现在想要的位置上,比如,我们有一大堆的精灵动画,如果在游戏中加载起来会让游戏有点卡,这时候我们就可以创建一个进入游戏时的加载页面,同时执行加载动画。一般游戏也都是这么做的。 规范代码,有利于编写代码。
好了它的优点和作用就说到这吧,肯定还有很多,我也就不知道了。
关于单例的问题大家可以看看这篇文章
http://www.zilongshanren.com/cocos2d-x-design-pattern-singleton1/
回到主题,首先我们粘贴一段代码。
第一步:复制黏贴
在魔塔的源代码中有一个单例类的模板,无脑的复制黏贴,这个模板是动画管理器AnimationManager的基类,这个有什么用呢,其实用处很简单就是一个单例的模板让继承他的子类都变成单例模式,下次再做别的游戏时用到直接继承,多方便。当然你也可以不用这个模板,直接让AnimationManager变成单例类。
#ifndef_SINGLETON_H#define_SINGLETON_Htemplate<classT>classSingleton{public://获取类的唯一实例staticinlineT*instance();//释放类的唯一实例voidrelease();protected:Singleton(void){}~Singleton(void){}staticT*_instance;};template<classT>inlineT*Singleton<T>::instance(){if(!_instance)_instance=newT;return_instance;}template<classT>voidSingleton<T>::release(){if(!_instance)return;delete_instance;_instance=0;}//cpp文件中需要先声明静态变量#defineDECLARE_SINGLETON_MEMBER(_Ty)\template<>_Ty*Singleton<_Ty>::_instance=NULL;#endif//_SINGLETON_H好了这样我们的标准的单例基类就写好了,记住这是一个.h文件
注意:
1.子类要在子类的cpp文件开始写上DECLARE_SINGLETON_MEMBER(子类的名字)
2.子类最好写上构造和析构函数
第二步:编写动画管理器AnimationManager类先看代码:AnimationManager.h
#ifndef_ANIMATION_MANAGER_H_#define_ANIMATION_MANAGER_H_#include"cocos2d.h"#include"Singleton.h"#include"type.h"usingnamespacecocos2d;classAnimationManager:publicSingleton<AnimationManager>{public:AnimationManager();~AnimationManager();//初始化动画模版缓存表boolinitAnimationMap();//根据名字得到一个动画模板CCAnimation*getAnimation(intkey);//创建一个动画实例CCAnimate*createAnimate(intkey);//创建一个动画实例CCAnimate*createAnimate(constchar*key);//清空所有缓存voidreleaseAllCacha();protected://加载勇士行走动画模版CCAnimation*createAnimationByDirection(HeroDirectiondirection);};//定义动画管理器实例的别名#definesAnimationMgrAnimationManager::instance()#endifAnimationManager.cpp
#include"AnimationManager.h"DECLARE_SINGLETON_MEMBER(AnimationManager);AnimationManager::AnimationManager(){}AnimationManager::~AnimationManager(){}boolAnimationManager::initAnimationMap(){boolsRet=false;do{//1.添加图片进内存CCTexture2D*creepTexture=CCTextureCache::sharedTextureCache()->addImage("boy.png");CC_BREAK_IF(!creepTexture);//2.加载各个方向的敌人动画chartemp[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);returnsRet;}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);returncocos2d::CCAnimate::create(anim);}returnNULL;}CCAnimate*AnimationManager::createAnimate(constchar*key){//获取指定动画模版CCAnimation*anim=CCAnimationCache::sharedAnimationCache()->animationByName(key);if(anim){//根据动画模版生成一个动画实例returncocos2d::CCAnimate::create(anim);}returnNULL;}CCAnimation*AnimationManager::createAnimationByDirection(HeroDirectiondirection){//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=newCCArray(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();returnanimation;}voidAnimationManager::releaseAllCacha(){}
建立完这个动画管理单例后,用法也是很简单,只需要调用那几个getXXXX 就行,当然这个动画管理器功能还比较简单,因为我是个新手所以不能一下吧所有的功能都写上,还是先用到哪些写那些。
第三步:全局数据
之后我们在建立一个单例类,来保存一些全局数据
HWorld.h
#ifndef__HWORLD_H__#define__HWORLD_H__#include"cocos2d.h"#include"type.h"#include"Singleton.h"usingnamespacecocos2d;classHWorld:publicSingleton<HWorld>{public:HWorld();~HWorld();//初始化boolinitHWorld();//清空所有缓存voidreleaseAll();public://路点数组CCPointArray*_wayPoint;};//定义动画管理器实例的别名#definesHWorldHWorld::instance()#endif
HWorld.cpp
#include"HWorld.h" DECLARE_SINGLETON_MEMBER(HWorld); boolHWorld::initHWorld() { returntrue; } voidHWorld::releaseAll() { } HWorld::HWorld() { } HWorld::~HWorld() { }
目前这个类里面之后一个路点的数组,这个数组中保存了地图上需要转弯地方的坐标,其他的东西以后再添加。
当然还有我们的枚举,把它放在一个.h文件中,方便查看
type.h
#ifndef__TYPE_H__ #define__TYPE_H__ typedefenum{ kDown=0,//向下方向 kLeft=1,//向左方向 kRight=2,//向右方向 kUp=3,//向上方向 kNormal, }HeroDirection;//勇士方向 typedefenum{ aDown=0,//向下行走动画 aLeft,//向左行走动画 aRight,//向右行走动画 aUp,//向上行走动画 aFight,//刀光动画 }AnimationKey;//动画模版键值 //定义怪物的类型 typedefenum{ kHighBlood=0,//高血量怪物 kQuick=1, }CreepType; //----------------定义一个creep中所用到的tag-------- typedefenum{ kSprite=0,//精灵的标签 kSpeedAction=1,//控制速度的action所用的标签 kFoveverAction=2,//控制精灵帧的action标签 }CreepTag; enum { kZMap=0,//地图的zOrder kZNPC, kZTeleport, kZHero,//勇士精灵的zOrder kZTip,//提示信息的zOrder };//GameLayer中各部分的显示zOrder及tag #endif
好了,生成一下。
下一篇会让我们的敌人动起来
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。