cocos引擎―《保卫萝卜》06:重构让角色鲜活起来

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《保卫萝卜》06:重构让角色鲜活起来一、前提:完成前一篇的内容。具体参考:《保卫萝卜》05:对游戏原型进行屏幕适配完善二、本篇目标:说说游戏中各种角色的动作、属性以及重构思路;进行代码重构让色狼大叔和女主角生动鲜活起来;三、内容:说说游戏中各种角色的动作、属性以及重构思路通过前两篇我们建立的一个简陋的游戏原型,但是游戏中的人物比如色狼大叔、女主角都看去来很呆板不够鲜活,比如色狼会沿着道路移动,那这个只能说是移动根本不像是在走路,没有走的动作感觉就是沿着道路在漂移,女主角也是一动不动的站那里。这样的游戏很没有乐趣,所以需要给这些游戏角色加入动作和表情,让人看去来他们是鲜活的,对这些角色进行一下简单的动画以及属性分析如下:色狼大叔的动画:1、静止动画:游戏刚开始处于静止状态2、走路动画:沿着道路走3、死亡动画:当子弹击中血量消耗完时死亡消失色狼大叔的属性:1、是否运动:色狼是否处于激活沿着道路行走2、是否死亡:是否被炮塔打死3、行走速度:不同色狼的行走速度不同4、色狼血量:不同色狼血量不同5、行走:沿着道路行走女主角的动画:1、静止动画:游戏刚开始处于静止状态2、卖萌动画:不能像木头似的,就加点表情动作3、死亡动画:当纯洁值被色狼玷污光了就死亡了女主角的属性:1、女主角贞洁值:相当于生命值根据上面的分析我们把每个角色拆分成动画显示和业务属性逻辑两个部分,对色狼和女主角进行代码重构。重构后大概结构如上图:ActionSprite:属于CCSprite类,负责游戏角色精灵的动画显示,Luoli(萝莉)、DaShu(大叔)、JiaoShou(叫兽)等角色精灵均继承自ActionSprite,都属于动画显示类。Luoli(萝莉):属ActionSprite的子类,负责女主角的动画效果展示。DaShu(大叔):属ActionSprite的子类,负责大叔色狼的动画效果展示。JiaoShou(叫兽):属ActionSprite的子类,负责叫兽色狼的动画效果展示。Selang(色狼):属于CCNode类,负责色狼的行走、血量、速度、攻击等具体的业务,每个Selang都包含一个DaShu(大叔)或JiaoShou(叫兽)类的游戏精灵。并且具备最重要的行为实现沿着道路行走。Girl(女孩):属于CCNode类,负责女主角的血量等具体的业务,每个Girl都包含一个Luoli类的游戏精灵。进行代码重构让色狼大叔和女主角生动鲜活起来打开项目工程按照上面的思路重点对色狼和女主角的代码实现进行重构。色狼大叔代码重构第一步:新建ActionSprite.h、ActionSprite.cpp类(角色动画类),这个类继承自CCSprite负责游戏角色的动画效果显示,色狼和女孩都会是这个类的子类。ActionSprite.h代码:12345678910111213141516171819//声明一个动作状态的枚举类型typedefenum_ActionState{kActionStateNone=0,//无状态kActionStateIdle,//静止状态kActionStateWalk,//行走状态kActionStateDeath//死亡状态}ActionState;classActionSprite:publiccocos2d::CCSprite{public:ActionSprite(void);~ActionSprite(void);//静止voididle();//死亡voiddeath();//行走voidwalk();//价格202122232425262728293031323334353637383940CC_SYNTHESIZE(int,_price,Price);//生命值CC_SYNTHESIZE(float,_hp,HP);//静止状态动作CC_SYNTHESIZE_RETAIN(cocos2d::Action*,_idleAction,IdleAction);//死亡状态动作CC_SYNTHESIZE_RETAIN(cocos2d::Action*,_deathAction,DeathAction);//行走状态动作CC_SYNTHESIZE_RETAIN(cocos2d::Action*,_walkAction,WalkAction);//当前动作状态CC_SYNTHESIZE(ActionState,_actionState,ActionState);//行走速度CC_SYNTHESIZE(float,_walkSpeed,WalkSpeed);//伤害值CC_SYNTHESIZE(float,_damage,Damage);//金钱CC_SYNTHESIZE(float,_money,Money);//是否有光环CC_SYNTHESIZE(bool,_halo,Halo);};ActionSprite.cpp代码:1234567891011121314151617181920ActionSprite::ActionSprite(void){_price=0;_idleAction=NULL;_walkAction=NULL;_deathAction=NULL;}ActionSprite::~ActionSprite(void){//释放内存CC_SAFE_RELEASE_NULL(_idleAction);CC_SAFE_RELEASE_NULL(_deathAction);CC_SAFE_RELEASE_NULL(_walkAction);}//设置精灵为静止状态voidActionSprite::idle(){if(_actionState!=kActionStateIdle){//先停止所有动作21222324252627282930313233343536373839404142this-stopAllActions();//运行静止动作this-runAction(_idleAction);_actionState=kActionStateIdle;}}//设置精灵为行走状态voidActionSprite::walk(){if(_actionState!=kActionStateWalk){//先停止所有动作this-stopAllActions();//运行行走动作this-runAction(_walkAction);_actionState=kActionStateWalk;}}//设置精灵为死亡状态voidActionSprite::death(){//先停止所有动作43444546this-stopAllActions();this-runAction(_deathAction);_actionState=kActionStateDeath;}第二步:素材准备,设计2张大叔不同动作的图片,交替显示模拟色狼行走动画,完成后把图片拷贝到Resources的iphonehd文件夹中,为了适应小分辨率的手机把这个2张图片按比例缩小一半并且拷贝到Resources的iphone文件夹中。第三步:新建DaShu.h、DaShu.cpp类(色狼大叔动画类),这个类继承自上面的ActionSprite负责游戏色狼大叔的动画效果显示。DaShu.h:1234567891011classDaShu:publicActionSprite{public:DaShu(void);~DaShu(void);CREATE_FUNC(DaShu);//初始化方法boolinit();//设置光环,拥有光环的色狼生命值加倍voidsetHalo(boolhalo);};DaShu.cpp:12345678boolDaShu::init(){boolbRet=false;do{CC_BREAK_IF(!ActionSprite::initWithFile(dashu_2.png));//设置静止状态动作9101112131415161718192VectorSpriteFrame*idleFrames(1);SpriteFrame*frame1=SpriteFrame::create(dashu_2.png,Rect(0,0,60,83));idleFrames.pushBack(frame1);Animation*idleAnimation=Animation::createWithSpriteFrames(idleFrames,float(6.0/12.0));this-setIdleAction(CCRepeatForever::create(CCAnimate::create(idleAnimation)));inti=0;//设置行走状态动作VectorSpriteFrame*walkFrames(2);for(i=0;i2;i++){SpriteFrame*frame2=SpriteFrame::create(CCString::createWithFormat(dashu_%d.png,i+1)-getCString(),Rect(0,0,60,83));walkFrames.pushBack(frame2);}Animation*walkAnimation=Animation::createWithSpriteFrames(walkFrames,float(6.0/12.0));this-setWalkAction(CCRepeatForever::create(CCAnimate::create(walkAnimation)));//设置死亡状态动作VectorSpriteFrame*deathFrames(1);SpriteFrame*frame3=SpriteFrame::create(dashu_2.png,Rect(0,0,60,83));0212223242526272829303deathFrames.pushBack(frame3);Animation*deathAnimation=Animation::createWithSpriteFrames(deathFrames,float(6.0/12.0));this-setDeathAction(Animate::create(deathAnimation));//设置攻击值this-setDamage(1);//设置行走速度this-setWalkSpeed(0.4f);//设置生命值this-setHP(18);//设置金钱数this-setMoney(1.0f/10.0f);bRet=true;}while(0);returnbRet;}//设置光环voidDaShu::setHalo(boolhalo){if(halo){//拥有光环后生命值加4倍1323334353637383940414floath=this-getHP()*4.0f;this-setHP(h);}}243444546474849505152第四步:新建Selang.h、Selang.cpp类(色狼类),这个类继承自CCNode游戏场景中的每一个色狼都有这个类产生,它肯定包含一个ActionSprite的色狼动画类,并且之前在MainScene.cpp的update方法中实现的色狼沿路行走代码也将转移到这个类的update方法中。Selang.h:123456789101#includecocos2d.h#includeWaypoint.h#includeGameMediator.h#includeActionSprite.hclassSelang:publiccocos2d::CCNode{public:Selang(void);~Selang(void);//根据提供的spriteIndex实例化成不同的色狼staticSelang*nodeWithType(intspri

1 / 39
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功