cocos2d-x 大型ARPG手游研发----精灵的八面玲珑_第1页
cocos2d-x 大型ARPG手游研发----精灵的八面玲珑_第2页
cocos2d-x 大型ARPG手游研发----精灵的八面玲珑_第3页
cocos2d-x 大型ARPG手游研发----精灵的八面玲珑_第4页
cocos2d-x 大型ARPG手游研发----精灵的八面玲珑_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、继续上一篇文章继续聊吧,这章内容会比较多,也会附上代码,很多朋友加了群,大家在群里面探讨了很多东西,这让大家都觉得受益匪浅,这便是极好的,废话不多了,精灵是游戏的重要组成部分,那ARPG里面的精灵必然是要做得很细的,因为精灵要能动,能跑,能打,甚至要能做各种交互动作等等。      大家可以看一下下面的题,是精灵制作的流程思路: 上图的人物素材来自于网络流传的梦幻西游,地图还有其他素材是以前公司同事制作的,如果游戏正式上线,会换一套完整的自制的素材。图中大家可以看到一个人物有很多部件组合而成,高端一点的游戏甚至部件多达几十上百种,甚至做出骨骼动画。不过以

2、我现在的做法是按照帧动画方式实现各个人物的动作,人物的body部分细节处理会很多,还有大家看到图中的字体(字体渲染描边,我做的是最简单的了,两个LABEL合成在一起,效果能达到就行),由于人物要有方向,而且我们一次性就做8方向的人物动画,那就需要8个方向的连帧图片:首先,要组装起来我们首先要建一个实体角色类,这个类里面不放别的,就统一放角色的部件属性:类#ifndef _MAIN_ROLE_DATA_#define _MAIN_ROLE_DATA_ #include "cocos2d.h"#include "./Commen_ActionToDo.h"#

3、include "./Commen_Direction.h"USING_NS_CC;class MainRoledatapublic :/人物的TAGint tags;/人物姓名CCString* spiritname;/人物初始坐标CCPoint nowpoint;/人物默认像素图CCString* spiritUrl;/人物站立像素图路径CCString* spiritUrl_zhan;/人物跑动像素图路径CCString* spiritUrl_pao;/人物攻击像素图路径CCString* spiritUrl_attack;/人物施法像素图路径/增加人物BUFCCSt

4、ring* spiritUrl_magic;/人物站立最大帧int maxcut_zhan;/人物跑动最大帧int maxcut_pao;/人物战斗最大帧int maxcut_attack;/人物施法最大帧int maxcut_magic;/人物当前动作Commen_ActionToDo acttodo;/人物当前朝向Commen_Direction dir;/动画时间float actiontime;#endif枚举几个方向,和动作的类:enum Commen_Directionup=0,down=1,lefts=2,rigth=3,rigth_up=4,rigth_down=5,left_

5、down=6,left_up=7;enum Commen_ActionToDorun=1,stand=2,attack=3,death=4,funny=5,magicup=6;OK,然后配置精灵数据,建了一个GetNPCData.cpp,GetNPCData.h,主要就是拿来初始化数据,大致的思路是要将上面的Model填充数据,相信大家能够用很多种方式去实现,填充数据(读取XML配置文件,直接写在代码中配置);接下来我们正式组装完整的八面玲珑的精灵,建立,; 文件内容如下:#ifndef _SPIRIT_PLAYER_#define _SPIRIT_PLAYER_ #include

6、"cocos2d.h"#include "./Commen_ActionToDo.h"#include "./Commen_Direction.h"#include "./GameData/MainRoledata.h"#include "./Commen/PublicShowUI.h"#include "./Effects/EffectsCommen.h"USING_NS_CC;class SpiritsPlayer : cocos2d:CCSprite public: C

7、CSprite* npc;CCSprite* yinzi;CCSprite* sp_liaotianbd;PublicShowUI* p_ui_name;CCArray *stringArray;CCAnimate* playdonghua;CCAnimate* playdonghua2;Commen_Direction move_dir;bool endflag;bool endflag2;bool thiszhujiao_flag;void Spirits_talkabout_hid(;SpiritsPlayer(MainRoledata roledata,int zOrder,bool

8、zhujiaoflag;SpiritsPlayer(void;CCAnimation* getNowAnt(MainRoledata roledata;CCAnimate* updateNowAnt(MainRoledata roledata;void updateNpcPoint(CCPoint newpoint;void moveTomap_dir(CCPoint newpoint;void moveTomap_move(int uestime,CCPoint newpoint,bool npcflag;/人物移动完成的回调void moveoverCallBack(void;/普通NPC

9、移动完成的回调void moveoverCallBackforNpc(void;/根据点击坐标获得人物的朝向Commen_Direction getNowPointDir(CCPoint newpoint;/ 触摸点是否在精灵上bool isTouchInside(CCPoint thisPos;/移动方式void movemethod(int uestime,CCPoint newpoint;private:/角色基本数据MainRoledata thisroledata;CCFiniteTimeAction *actall;CCActionInterval* act_moveto_zi;C

10、CActionInterval* act_moveto_npc;CCActionInterval* act_moveto_yinzi;CCActionInterval* act_moveto_eff;CCActionInterval* act_moveto_eff_zhujiao;CCFiniteTimeAction *actbackfun; int flag ;private:CCRect rect(;#endif/_SPIRIT_PLAYER_#include "./ImagePaths.h"#include "./GameData/GetNPCData.h&

11、quot;#include "./Commen/FontChina.h"SpiritsPlayer:SpiritsPlayer(MainRoledata roledata,int zOrder,bool zhujiaoflag/先初始化部分数据thisroledata = roledata;act_moveto_zi =NULL;act_moveto_npc =NULL;act_moveto_yinzi =NULL;actall=NULL;thiszhujiao_flag = zhujiaoflag;p_ui_name = new PublicShowUI(;flag =

12、0;npc = SpiritsPlayer:create(roledata.spiritUrl->getCString(;if(npc=NULLCCLog("图层路径有误,请检查路径"return;/设置NPC初始位置坐标(该坐标取决于当前画层)npc->setPosition(roledata.nowpoint;/NPC动画设置playdonghua = SpiritsPlayer:updateNowAnt(roledata;npc->runAction(playdonghua;/*开始添加角色各部件*/添加角色名称CCLabelTTF* label =

13、 CCLabelTTF:create(roledata.spiritname->getCString(, "微软雅黑",12;label->setColor(ccWHITE;label->setDirty(true;label->setPosition(ccp(npc->getContentSize(.width/2,npc->getContentSize(.height+6;CCLabelTTF* labelback = CCLabelTTF:create(roledata.spiritname->getCString(, &qu

14、ot;微软雅黑",12;labelback->setColor(ccBLACK;labelback->setDirty(true;labelback->setPosition(ccp(npc->getContentSize(.width/2+1,npc->getContentSize(.height+6-1;/添加NPC人物脚下阴影yinzi = CCSprite:create(p_yinzi;if(yinzi=NULLCCLog("图层路径有误,请检查路径"return;if(zhujiaoflag=trueyinzi->se

15、tPosition(ccp(npc->getContentSize(.width/2,12;elseyinzi->setPosition(ccp(npc->getContentSize(.width/2,1;npc->addChild(yinzi,-1,110;npc->addChild(label,2,111;npc->addChild(labelback,1,112;cocos2d:CCRect SpiritsPlayer:rect(/获取精灵区域大小return CCRectMake(npc->getPositionX(- npc->get

16、ContentSize(.width * npc->getAnchorPoint(.x,npc->getPositionY(-npc->getContentSize(.height* npc->getAnchorPoint(.y,npc->getContentSize(.width, npc->getContentSize(.height; bool SpiritsPlayer:isTouchInside(CCPoint thisPosCCPoint localPos = thisPos;CCRect rc = rect(;bool isTouched =

17、rc.containsPoint(localPos;if (isTouched = true CCLog(FontChina:G2U("触发点击"elseCCLog(FontChina:G2U("未点击"return isTouched;void SpiritsPlayer:Spirits_talkabout_hid(CCLog(FontChina:G2U("*调用了*"CCAnimate* SpiritsPlayer:updateNowAnt(MainRoledata roledata/NPC动画CCAnimation* dongh

18、ua = SpiritsPlayer:getNowAnt(roledata;if(roledata.actiontime>0donghuaroledata.maxcut_zhan;else donghua->setDelayPerUnit(/;/执行默认时间donghua->setRestoreOriginalFrame(true;donghua->setLoops(-1;CCAnimate* playdonghua = CCAnimate:create(donghua;return playdonghua;/* 主角位移移动*/void SpiritsPlayer:m

19、oveTomap_move(int uestime, CCPoint newpoint,bool npcflagif(npcflag=trueactbackfun = CCCallFunc:create(this, callfunc_selector(SpiritsPlayer:moveoverCallBackforNpc;elseactbackfun = CCCallFunc:create(this, callfunc_selector(SpiritsPlayer:moveoverCallBack;movemethod(uestime,newpoint;void SpiritsPlayer:

20、movemethod(int uestime,CCPoint newpointnpc->stopAction(actall;act_moveto_npc = CCMoveTo:create(uestime,ccp(newpoint.x,newpoint.y+20;actall = CCSequence:create(act_moveto_npc,actbackfun,NULL;npc->runAction(actall;/* 改变移动方向*/void SpiritsPlayer:moveTomap_dir(CCPoint newpointGetNPCData npcdata = G

21、etNPCData(;npcdata.GetNPCchapter1(;move_dir=SpiritsPlayer:getNowPointDir(newpoint;=move_dir;npcdata.role_player.acttodo = run;=;npc->stopAction(playdonghua;playdonghua = SpiritsPlayer:updateNowAnt(npcdata.role_player;npc->runAction(playdonghua;/* 根据点击坐标获得人物的朝向*/Commen_Direction SpiritsPlayer:g

22、etNowPointDir(CCPoint newpointCommen_Direction thisdir = rigth_down; /默认为右下/计算移动数据float center_x,center_y,npc_x,npc_y;int move_x,move_y;/更新NPC方向,状态CCPoint origin = CCDirector:sharedDirector(->getVisibleOrigin(;CCSize size = CCDirector:sharedDirector(->getWinSize(;center_x 2;center_y 2;npc_x =

23、npc->getPositionX(;npc_y = npc->getPositionY(;move_x = (int(npc_x -newpoint.x ;move_y = (int(npc_y -newpoint.y - 20;if(move_x>=10&&move_y<=-10/左上thisdir = left_up;else if(move_x>=10&&move_y>=10/左下thisdir = left_down;else if(move_x<=-10&&move_y<=-10/右上t

24、hisdir = rigth_up;else if(move_x<=-10&&move_y>=10/右下thisdir =rigth_down;else if(move_x>-10&&move_x<10&&move_y>0/下thisdir =down;else if(move_x>-10&&move_x<10&&move_y<0/上thisdir =up;else if(move_x>0&&move_y>-10&&move

25、_y<10/左thisdir = lefts;else if(move_x<0&&move_y>-10&&move_y<10/右thisdir =rigth;return thisdir;/* 移动完成后的回调*/void SpiritsPlayer:moveoverCallBack(/移动完成之后恢复站立状态GetNPCData npcdata = GetNPCData(;npcdata.GetNPCchapter1(;=move_dir;npcdata.role_player.acttodo = stand;=;npc->sto

26、pAction(playdonghua;playdonghua = SpiritsPlayer:updateNowAnt(npcdata.role_player;npc->runAction(playdonghua;/* 普通NPC移动完成后的回调*/void SpiritsPlayer:moveoverCallBackforNpc(/* 点击瞬移至此*/void SpiritsPlayer:updateNpcPoint(CCPoint newpointp_ui_name->updataGameText(ccp(newpoint.x,newpoint.y+npc->getCo

27、ntentSize(.height/2+10;npc->setPosition(newpoint;yinzi->setPosition(ccp(newpoint.x,newpoint.y-npc->getContentSize(.height/2+5;/* 八方向人物动作合成器*/CCAnimation* SpiritsPlayer:getNowAnt(MainRoledata roledataCCAnimation* thisdonghua = CCAnimation:create(;switchcase up:switchcase run:for(int i = 0; i

28、<=roledata.maxcut_pao ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s06%03d.png",roledata.spiritUrl_pao->getCString(,i;thisdonghua->addSpriteFrameWithFileName(donghuaurl;break;case stand:for(int i = 0; i<=roledata.maxcut_zhan ; i+char donghuaurl100 = 0;sprintf(donghuaurl,&quo

29、t;%s06%03d.png",roledata.spiritUrl_zhan->getCString(,i;thisdonghua->addSpriteFrameWithFileName(donghuaurl;break;case attack:break;case death:break;case funny:break;default:break;break;case down:switchcase run:for(int i = 0; i<=roledata.maxcut_pao ; i+char donghuaurl100 = 0;sprintf(dong

30、huaurl,"%s04%03d.png",roledata.spiritUrl_pao->getCString(,i;thisdonghua->addSpriteFrameWithFileName(donghuaurl;break;case stand:for(int i = 0; i<=roledata.maxcut_zhan ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s04%03d.png",roledata.spiritUrl_zhan->getCString(,i;t

31、hisdonghua->addSpriteFrameWithFileName(donghuaurl;break;case attack:break;case death:break;case funny:break;default:break;break;case lefts:switchcase run:for(int i = 0; i<=roledata.maxcut_pao ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s05%03d.png",roledata.spiritUrl_pao->getC

32、String(,i;thisdonghua->addSpriteFrameWithFileName(donghuaurl;break;case stand:for(int i = 0; i<=roledata.maxcut_zhan ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s05%03d.png",roledata.spiritUrl_zhan->getCString(,i;thisdonghua->addSpriteFrameWithFileName(donghuaurl;break;case

33、 attack:break;case death:break;case funny:break;default:break;break;case rigth:switchcase run:for(int i = 0; i<=roledata.maxcut_pao ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s07%03d.png",roledata.spiritUrl_pao->getCString(,i;thisdonghua->addSpriteFrameWithFileName(donghuaurl

34、;break;case stand:for(int i = 0; i<=roledata.maxcut_zhan ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s07%03d.png",roledata.spiritUrl_zhan->getCString(,i;thisdonghua->addSpriteFrameWithFileName(donghuaurl;break;case attack:break;case death:break;case funny:break;default:break;b

35、reak;case rigth_up:switchcase run:for(int i = 0; i<=roledata.maxcut_pao ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s03%03d.png",roledata.spiritUrl_pao->getCString(,i;thisdonghua->addSpriteFrameWithFileName(donghuaurl;break;case stand:for(int i = 0; i<=roledata.maxcut_zhan

36、; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s03%03d.png",roledata.spiritUrl_zhan->getCString(,i;thisdonghua->addSpriteFrameWithFileName(donghuaurl;break;case attack:for(int i = 0; i<=roledata.maxcut_attack ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s03%03d.png",

37、roledata.spiritUrl_attack->getCString(,i;thisdonghua->addSpriteFrameWithFileName(donghuaurl;break;case magicup:for(int i = 0; i<=roledata.maxcut_magic ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s03%03d.png",roledata.spiritUrl_magic->getCString(,i;thisdonghua->addSpriteF

38、rameWithFileName(donghuaurl;break;case death:break;case funny:break;default:break;break;case rigth_down:switchcase run:for(int i = 0; i<=roledata.maxcut_pao ; i+char donghuaurl1000 = 0;sprintf(donghuaurl,"%s00%03d.png",roledata.spiritUrl_pao->getCString(,i;thisdonghua->addSpriteFr

39、ameWithFileName(donghuaurl;break;case stand:for(int i = 0; i<=roledata.maxcut_zhan ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s00%03d.png",roledata.spiritUrl_zhan->getCString(,i;thisdonghua->addSpriteFrameWithFileName(donghuaurl;break;case attack:for(int i = 0; i<=roledata

40、.maxcut_attack ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s00%03d.png",roledata.spiritUrl_attack->getCString(,i;thisdonghua->addSpriteFrameWithFileName(donghuaurl;break;case magicup:for(int i = 0; i<=roledata.maxcut_magic ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s

41、00%03d.png",roledata.spiritUrl_magic->getCString(,i;thisdonghua->addSpriteFrameWithFileName(donghuaurl;break;case death:break;case funny:break;default:break;break;case left_down:switchcase run:for(int i = 0; i<=roledata.maxcut_pao ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s0

42、1%03d.png",roledata.spiritUrl_pao->getCString(,i;thisdonghua->addSpriteFrameWithFileName(donghuaurl;break;case stand:for(int i = 0; i<=roledata.maxcut_zhan ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s01%03d.png",roledata.spiritUrl_zhan->getCString(,i;thisdonghua->a

43、ddSpriteFrameWithFileName(donghuaurl;break;case attack:for(int i = 0; i<=roledata.maxcut_attack ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s01%03d.png",roledata.spiritUrl_attack->getCString(,i;thisdonghua->addSpriteFrameWithFileName(donghuaurl;break;case magicup:for(int i = 0

44、; i<=roledata.maxcut_magic ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s01%03d.png",roledata.spiritUrl_magic->getCString(,i;thisdonghua->addSpriteFrameWithFileName(donghuaurl;break;case death:break;case funny:break;default:break;break;case left_up:case run:for(int i = 0; i<

45、=roledata.maxcut_pao ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s02%03d.png",roledata.spiritUrl_pao->getCString(,i;thisdonghua->addSpriteFrameWithFileName(donghuaurl;break;case stand:for(int i = 0; i<=roledata.maxcut_zhan ; i+char donghuaurl100 = 0;sprintf(donghuaurl,"%s02%03d.png",roledata.spiritUrl_zhan->getCString(,i;thisdonghua-&g

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论