继续上一篇文章继续聊吧,这章内容会比较多,也会附上代码,很多朋友加了群,大家在群里面探讨了很多东西,这让大家都觉得受益匪浅,这便是极好的,废话不多了,精灵是游戏的重要组成部分,那ARPG里面的精灵必然是要做得很细的,因为精灵要能动,能跑,能打,甚至要能做各种交互动作等等。

大家可以看一下下面的题,是精灵制作的流程思路:

  

  上图的人物素材来自于网络流传的梦幻西游,地图还有其他素材是以前公司同事制作的,如果游戏正式上线,会换一套完整的自制的素材。图中大家可以看到一个人物有很多部件组合而成,高端一点的游戏甚至部件多达几十上百种,甚至做出骨骼动画。不过以我现在的做法是按照帧动画方式实现各个人物的动作,人物的body部分细节处理会很多,还有大家看到图中的字体(字体渲染描边,我做的是最简单的了,两个LABEL合成在一起,效果能达到就行),由于人物要有方向,而且我们一次性就做8方向的人物动画,那就需要8个方向的连帧图片:

  首先,要组装起来我们首先要建一个实体角色类,这个类里面不放别的,就统一放角色的部件属性:

  

  1. MainRoledata.h
  1. #ifndef _MAIN_ROLE_DATA_
  2. #define _MAIN_ROLE_DATA_
  3.  
  4. #include "cocos2d.h"
  5. #include "../Commen_ActionToDo.h"
  6. #include "../Commen_Direction.h"
  7. USING_NS_CC;
  8.  
  9. class MainRoledata
  10. {
  11. public :
  12.  
  13. //人物的TAG
  14. int tags;
  15. //人物姓名
  16. CCString* spiritname;
  17. //人物初始坐标
  18. CCPoint nowpoint;
  19. //人物默认像素图
  20. CCString* spiritUrl;
  21. //人物站立像素图路径
  22. CCString* spiritUrl_zhan;
  23. //人物跑动像素图路径
  24. CCString* spiritUrl_pao;
  25. //人物攻击像素图路径
  26. CCString* spiritUrl_attack;
  27. //人物施法像素图路径/增加人物BUF
  28. CCString* spiritUrl_magic;
  29. //人物站立最大帧
  30. int maxcut_zhan;
  31. //人物跑动最大帧
  32. int maxcut_pao;
  33. //人物战斗最大帧
  34. int maxcut_attack;
  35. //人物施法最大帧
  36. int maxcut_magic;
  37. //人物当前动作
  38. Commen_ActionToDo acttodo;
  39. //人物当前朝向
  40. Commen_Direction dir;
  41. //动画时间
  42. float actiontime;
  43.  
  44. };
  45.  
  46. #endif

枚举几个方向,和动作的类:

  1. enum Commen_Direction
  2. {
  3. up=,
  4. down=,
  5. lefts=,
  6. rigth=,
  7. rigth_up=,
  8. rigth_down=,
  9. left_down=,
  10. left_up=
  11. };
  1. enum Commen_ActionToDo
  2. {
  3. run=,
  4. stand=,
  5. attack=,
  6. death=,
  7. funny=,
  8. magicup=
  9. };

OK,然后配置精灵数据,建了一个GetNPCData.cpp,GetNPCData.h,主要就是拿来初始化数据,大致的思路是要将上面的Model填充数据,相信大家

能够用很多种方式去实现,填充数据(读取XML配置文件,直接写在代码中配置);

接下来我们正式组装完整的八面玲珑的精灵,建立SpiritsPlayer.cpp,SpiritsPlayer.h;

文件内容如下:

  1. #ifndef _SPIRIT_PLAYER_
  2. #define _SPIRIT_PLAYER_
  3.  
  4. #include "cocos2d.h"
  5. #include "../Commen_ActionToDo.h"
  6. #include "../Commen_Direction.h"
  7. #include "../GameData/MainRoledata.h"
  8. #include "../Commen/PublicShowUI.h"
  9. #include "../Effects/EffectsCommen.h"
  10.  
  11. USING_NS_CC;
  12.  
  13. class SpiritsPlayer : cocos2d::CCSprite
  14. {
  15. public:
  16.  
  17. CCSprite* npc;
  18. CCSprite* yinzi;
  19. CCSprite* sp_liaotianbd;
  20.  
  21. PublicShowUI* p_ui_name;
  22.  
  23. CCArray *stringArray;
  24. CCAnimate* playdonghua;
  25. CCAnimate* playdonghua2;
  26. Commen_Direction move_dir;
  27.  
  28. bool endflag;
  29. bool endflag2;
  30. bool thiszhujiao_flag;
  31.  
  32. void Spirits_talkabout_hid();
  33.  
  34. SpiritsPlayer(MainRoledata roledata,int zOrder,bool zhujiaoflag);
  35. ~SpiritsPlayer(void);
  36. CCAnimation* getNowAnt(MainRoledata roledata);
  37. CCAnimate* updateNowAnt(MainRoledata roledata);
  38. void updateNpcPoint(CCPoint newpoint);
  39. void moveTomap_dir(CCPoint newpoint);
  40. void moveTomap_move(int uestime,CCPoint newpoint,bool npcflag);
  41. //人物移动完成的回调
  42. void moveoverCallBack(void);
  43. //普通NPC移动完成的回调
  44. void moveoverCallBackforNpc(void);
  45. //根据点击坐标获得人物的朝向
  46. Commen_Direction getNowPointDir(CCPoint newpoint);
  47. // 触摸点是否在精灵上
  48. bool isTouchInside(CCPoint thisPos);
  49. //移动方式
  50. void movemethod(int uestime,CCPoint newpoint);
  51.  
  52. private:
  53. //角色基本数据
  54. MainRoledata thisroledata;
  55. CCFiniteTimeAction *actall;
  56. CCActionInterval* act_moveto_zi;
  57. CCActionInterval* act_moveto_npc;
  58. CCActionInterval* act_moveto_yinzi;
  59. CCActionInterval* act_moveto_eff;
  60. CCActionInterval* act_moveto_eff_zhujiao;
  61. CCFiniteTimeAction *actbackfun;
  62. int flag ;
  63.  
  64. private:
  65. CCRect rect();
  66.  
  67. };
  68. #endif//_SPIRIT_PLAYER_
  69.  
  70.   
  1. #include "../ImagePaths.h"
  2. #include "../GameData/GetNPCData.h"
  3. #include "../Commen/FontChina.h"
  4.  
  5. SpiritsPlayer::SpiritsPlayer(MainRoledata roledata,int zOrder,bool zhujiaoflag)
  6. {
  7.  
  8. //先初始化部分数据
  9. thisroledata = roledata;
  10. act_moveto_zi =NULL;
  11. act_moveto_npc =NULL;
  12. act_moveto_yinzi =NULL;
  13. actall=NULL;
  14. thiszhujiao_flag = zhujiaoflag;
  15. p_ui_name = new PublicShowUI();
  16. flag = ;
  17.  
  18. npc = SpiritsPlayer::create(roledata.spiritUrl->getCString());
  19. if(npc==NULL)
  20. {
  21. CCLog("图层路径有误,请检查路径");
  22. return;
  23. }
  24. //设置NPC初始位置坐标(该坐标取决于当前画层)
  25. npc->setPosition(roledata.nowpoint);
  26. //NPC动画设置
  27. playdonghua = SpiritsPlayer::updateNowAnt(roledata);
  28. npc->runAction(playdonghua);
  29.  
  30. /**开始添加角色各部件**/
  31. //添加角色名称
  32. CCLabelTTF* label = CCLabelTTF::create(roledata.spiritname->getCString(), "微软雅黑",);
  33. label->setColor(ccWHITE);
  34. label->setDirty(true);
  35. label->setPosition(ccp(npc->getContentSize().width/,npc->getContentSize().height+));
  36.  
  37. CCLabelTTF* labelback = CCLabelTTF::create(roledata.spiritname->getCString(), "微软雅黑",);
  38. labelback->setColor(ccBLACK);
  39. labelback->setDirty(true);
  40. labelback->setPosition(ccp(npc->getContentSize().width/+,npc->getContentSize().height+-));
  41.  
  42. //添加NPC人物脚下阴影
  43. yinzi = CCSprite::create(p_yinzi);
  44. if(yinzi==NULL)
  45. {
  46. CCLog("图层路径有误,请检查路径");
  47. return;
  48. }
  49. if(zhujiaoflag==true)
  50. {
  51. yinzi->setPosition(ccp(npc->getContentSize().width/,));
  52. }
  53. else
  54. {
  55. yinzi->setPosition(ccp(npc->getContentSize().width/,));
  56. }
  57.  
  58. npc->addChild(yinzi,-,);
  59. npc->addChild(label,,);
  60. npc->addChild(labelback,,);
  61.  
  62. }
  63.  
  64. cocos2d::CCRect SpiritsPlayer::rect()
  65. {
  66. //获取精灵区域大小
  67. return CCRectMake(npc->getPositionX()- npc->getContentSize().width * npc->getAnchorPoint().x,npc->getPositionY()-npc->getContentSize().height* npc->getAnchorPoint().y,npc->getContentSize().width, npc->getContentSize().height);
  68.  
  69. }
  70.  
  71. bool SpiritsPlayer::isTouchInside(CCPoint thisPos)
  72. {
  73. CCPoint localPos = thisPos;
  74. CCRect rc = rect();
  75. bool isTouched = rc.containsPoint(localPos);
  76. if (isTouched == true) {
  77. CCLog(FontChina::G2U("触发点击"));
  78.  
  79. }else
  80. {
  81. CCLog(FontChina::G2U("未点击"));
  82. }
  83. return isTouched;
  84. }
  85.  
  86. void SpiritsPlayer::Spirits_talkabout_hid()
  87. {
  88. CCLog(FontChina::G2U("************调用了*****************"));
  89. }
  90.  
  91. CCAnimate* SpiritsPlayer::updateNowAnt(MainRoledata roledata)
  92. {
  93. //NPC动画
  94. CCAnimation* donghua = SpiritsPlayer::getNowAnt(roledata);
  95. if(roledata.actiontime>)
  96. {
  97. donghua->setDelayPerUnit(roledata.actiontime/roledata.maxcut_zhan);
  98. }
  99. else
  100. {
  101. donghua->setDelayPerUnit(2.0f/15.0f);//执行默认时间
  102. }
  103. donghua->setRestoreOriginalFrame(true);
  104. donghua->setLoops(-);
  105. CCAnimate* playdonghua = CCAnimate::create(donghua);
  106.  
  107. return playdonghua;
  108. }
  109.  
  110. /*************
  111. * 主角位移移动
  112. *************/
  113. void SpiritsPlayer::moveTomap_move(int uestime, CCPoint newpoint,bool npcflag)
  114. {
  115. if(npcflag==true)
  116. {
  117. actbackfun = CCCallFunc::create(this, callfunc_selector(SpiritsPlayer::moveoverCallBackforNpc));
  118. }
  119. else
  120. {
  121. actbackfun = CCCallFunc::create(this, callfunc_selector(SpiritsPlayer::moveoverCallBack));
  122. }
  123. movemethod(uestime,newpoint);
  124. }
  125.  
  126. void SpiritsPlayer::movemethod(int uestime,CCPoint newpoint)
  127. {
  128. npc->stopAction(actall);
  129. act_moveto_npc = CCMoveTo::create(uestime,ccp(newpoint.x,newpoint.y+));
  130. actall = CCSequence::create(act_moveto_npc,actbackfun,NULL);
  131. npc->runAction(actall);
  132. }
  133.  
  134. /*************
  135. * 改变移动方向
  136. *************/
  137. void SpiritsPlayer::moveTomap_dir(CCPoint newpoint)
  138. {
  139. GetNPCData npcdata = GetNPCData();
  140. npcdata.GetNPCchapter1();
  141. move_dir=SpiritsPlayer::getNowPointDir(newpoint);
  142. npcdata.role_player.dir=move_dir;
  143. npcdata.role_player.acttodo = run;
  144. npcdata.role_player.actiontime=0.5;
  145. npc->stopAction(playdonghua);
  146. playdonghua = SpiritsPlayer::updateNowAnt(npcdata.role_player);
  147. npc->runAction(playdonghua);
  148. }
  149.  
  150. /*************
  151. * 根据点击坐标获得人物的朝向
  152. *************/
  153. Commen_Direction SpiritsPlayer::getNowPointDir(CCPoint newpoint)
  154. {
  155. Commen_Direction thisdir = rigth_down; //默认为右下
  156. //计算移动数据
  157. float center_x,center_y,npc_x,npc_y;
  158. int move_x,move_y;
  159. //更新NPC方向,状态
  160. CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
  161. CCSize size = CCDirector::sharedDirector()->getWinSize();
  162.  
  163. center_x = size.width/;
  164. center_y = size.height/;
  165. npc_x = npc->getPositionX();
  166. npc_y = npc->getPositionY();
  167.  
  168. move_x = (int)(npc_x -newpoint.x );
  169. move_y = (int)(npc_y -newpoint.y - );
  170.  
  171. if(move_x>=&&move_y<=-)
  172. {
  173. //左上
  174. thisdir = left_up;
  175. }
  176. else if(move_x>=&&move_y>=)
  177. {
  178. //左下
  179. thisdir = left_down;
  180. }
  181. else if(move_x<=-&&move_y<=-)
  182. {
  183. //右上
  184. thisdir = rigth_up;
  185. }
  186. else if(move_x<=-&&move_y>=)
  187. {
  188. //右下
  189. thisdir =rigth_down;
  190. }
  191. else if(move_x>-&&move_x<&&move_y>)
  192. {
  193. //下
  194. thisdir =down;
  195. }
  196. else if(move_x>-&&move_x<&&move_y<)
  197. {
  198. //上
  199. thisdir =up;
  200. }
  201. else if(move_x>&&move_y>-&&move_y<)
  202. {
  203. //左
  204. thisdir = lefts;
  205. }
  206. else if(move_x<&&move_y>-&&move_y<)
  207. {
  208. //右
  209. thisdir =rigth;
  210. }
  211. return thisdir;
  212. }
  213.  
  214. /*************
  215. * 移动完成后的回调
  216. *************/
  217. void SpiritsPlayer::moveoverCallBack()
  218. {
  219. //移动完成之后恢复站立状态
  220. GetNPCData npcdata = GetNPCData();
  221. npcdata.GetNPCchapter1();
  222. npcdata.role_player.dir=move_dir;
  223. npcdata.role_player.acttodo = stand;
  224. npcdata.role_player.actiontime=1.1f;
  225. npc->stopAction(playdonghua);
  226. playdonghua = SpiritsPlayer::updateNowAnt(npcdata.role_player);
  227. npc->runAction(playdonghua);
  228. }
  229.  
  230. /*************
  231. * 普通NPC移动完成后的回调
  232. *************/
  233. void SpiritsPlayer::moveoverCallBackforNpc()
  234. {
  235.  
  236. }
  237.  
  238. /*************
  239. * 点击瞬移至此
  240. *************/
  241. void SpiritsPlayer::updateNpcPoint(CCPoint newpoint)
  242. {
  243. p_ui_name->updataGameText(ccp(newpoint.x,newpoint.y+npc->getContentSize().height/+));
  244. npc->setPosition(newpoint);
  245. yinzi->setPosition(ccp(newpoint.x,newpoint.y-npc->getContentSize().height/+));
  246. }
  247.  
  248. /*********************
  249. * 八方向人物动作合成器
  250. *********************/
  251. CCAnimation* SpiritsPlayer::getNowAnt(MainRoledata roledata)
  252. {
  253. CCAnimation* thisdonghua = CCAnimation::create();
  254. switch (roledata.dir)
  255. {
  256. case up:
  257.  
  258. switch (roledata.acttodo)
  259. {
  260. case run:
  261. for(int i = ; i<=roledata.maxcut_pao ; i++)
  262. {
  263. char donghuaurl[] = {};
  264. sprintf(donghuaurl,"%s06%03d.png",roledata.spiritUrl_pao->getCString(),i);
  265. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  266. }
  267. break;
  268. case stand:
  269. for(int i = ; i<=roledata.maxcut_zhan ; i++)
  270. {
  271. char donghuaurl[] = {};
  272. sprintf(donghuaurl,"%s06%03d.png",roledata.spiritUrl_zhan->getCString(),i);
  273. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  274. }
  275. break;
  276. case attack:
  277. break;
  278. case death:
  279. break;
  280. case funny:
  281. break;
  282. default:
  283. break;
  284. }
  285.  
  286. break;
  287. case down:
  288. switch (roledata.acttodo)
  289. {
  290. case run:
  291. for(int i = ; i<=roledata.maxcut_pao ; i++)
  292. {
  293. char donghuaurl[] = {};
  294. sprintf(donghuaurl,"%s04%03d.png",roledata.spiritUrl_pao->getCString(),i);
  295. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  296. }
  297. break;
  298. case stand:
  299. for(int i = ; i<=roledata.maxcut_zhan ; i++)
  300. {
  301. char donghuaurl[] = {};
  302. sprintf(donghuaurl,"%s04%03d.png",roledata.spiritUrl_zhan->getCString(),i);
  303. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  304. }
  305. break;
  306. case attack:
  307. break;
  308. case death:
  309. break;
  310. case funny:
  311. break;
  312. default:
  313. break;
  314. }
  315. break;
  316. case lefts:
  317. switch (roledata.acttodo)
  318. {
  319. case run:
  320. for(int i = ; i<=roledata.maxcut_pao ; i++)
  321. {
  322. char donghuaurl[] = {};
  323. sprintf(donghuaurl,"%s05%03d.png",roledata.spiritUrl_pao->getCString(),i);
  324. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  325. }
  326. break;
  327. case stand:
  328. for(int i = ; i<=roledata.maxcut_zhan ; i++)
  329. {
  330. char donghuaurl[] = {};
  331. sprintf(donghuaurl,"%s05%03d.png",roledata.spiritUrl_zhan->getCString(),i);
  332. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  333. }
  334. break;
  335. case attack:
  336. break;
  337. case death:
  338. break;
  339. case funny:
  340. break;
  341. default:
  342. break;
  343. }
  344. break;
  345. case rigth:
  346. switch (roledata.acttodo)
  347. {
  348. case run:
  349. for(int i = ; i<=roledata.maxcut_pao ; i++)
  350. {
  351. char donghuaurl[] = {};
  352. sprintf(donghuaurl,"%s07%03d.png",roledata.spiritUrl_pao->getCString(),i);
  353. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  354. }
  355. break;
  356. case stand:
  357. for(int i = ; i<=roledata.maxcut_zhan ; i++)
  358. {
  359. char donghuaurl[] = {};
  360. sprintf(donghuaurl,"%s07%03d.png",roledata.spiritUrl_zhan->getCString(),i);
  361. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  362. }
  363. break;
  364. case attack:
  365. break;
  366. case death:
  367. break;
  368. case funny:
  369. break;
  370. default:
  371. break;
  372. }
  373. break;
  374. case rigth_up:
  375. switch (roledata.acttodo)
  376. {
  377. case run:
  378. for(int i = ; i<=roledata.maxcut_pao ; i++)
  379. {
  380. char donghuaurl[] = {};
  381. sprintf(donghuaurl,"%s03%03d.png",roledata.spiritUrl_pao->getCString(),i);
  382. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  383. }
  384. break;
  385. case stand:
  386. for(int i = ; i<=roledata.maxcut_zhan ; i++)
  387. {
  388. char donghuaurl[] = {};
  389. sprintf(donghuaurl,"%s03%03d.png",roledata.spiritUrl_zhan->getCString(),i);
  390. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  391. }
  392. break;
  393. case attack:
  394. for(int i = ; i<=roledata.maxcut_attack ; i++)
  395. {
  396. char donghuaurl[] = {};
  397. sprintf(donghuaurl,"%s03%03d.png",roledata.spiritUrl_attack->getCString(),i);
  398. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  399. }
  400. break;
  401. case magicup:
  402. for(int i = ; i<=roledata.maxcut_magic ; i++)
  403. {
  404. char donghuaurl[] = {};
  405. sprintf(donghuaurl,"%s03%03d.png",roledata.spiritUrl_magic->getCString(),i);
  406. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  407. }
  408. break;
  409. case death:
  410. break;
  411. case funny:
  412. break;
  413. default:
  414. break;
  415. }
  416. break;
  417. case rigth_down:
  418. switch (roledata.acttodo)
  419. {
  420. case run:
  421. for(int i = ; i<=roledata.maxcut_pao ; i++)
  422. {
  423. char donghuaurl[] = {};
  424. sprintf(donghuaurl,"%s00%03d.png",roledata.spiritUrl_pao->getCString(),i);
  425. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  426. }
  427. break;
  428. case stand:
  429. for(int i = ; i<=roledata.maxcut_zhan ; i++)
  430. {
  431. char donghuaurl[] = {};
  432. sprintf(donghuaurl,"%s00%03d.png",roledata.spiritUrl_zhan->getCString(),i);
  433. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  434. }
  435. break;
  436. case attack:
  437. for(int i = ; i<=roledata.maxcut_attack ; i++)
  438. {
  439. char donghuaurl[] = {};
  440. sprintf(donghuaurl,"%s00%03d.png",roledata.spiritUrl_attack->getCString(),i);
  441. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  442. }
  443. break;
  444. case magicup:
  445. for(int i = ; i<=roledata.maxcut_magic ; i++)
  446. {
  447. char donghuaurl[] = {};
  448. sprintf(donghuaurl,"%s00%03d.png",roledata.spiritUrl_magic->getCString(),i);
  449. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  450. }
  451. break;
  452. case death:
  453. break;
  454. case funny:
  455. break;
  456. default:
  457. break;
  458. }
  459. break;
  460. case left_down:
  461. switch (roledata.acttodo)
  462. {
  463. case run:
  464. for(int i = ; i<=roledata.maxcut_pao ; i++)
  465. {
  466. char donghuaurl[] = {};
  467. sprintf(donghuaurl,"%s01%03d.png",roledata.spiritUrl_pao->getCString(),i);
  468. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  469. }
  470. break;
  471. case stand:
  472. for(int i = ; i<=roledata.maxcut_zhan ; i++)
  473. {
  474. char donghuaurl[] = {};
  475. sprintf(donghuaurl,"%s01%03d.png",roledata.spiritUrl_zhan->getCString(),i);
  476. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  477. }
  478. break;
  479. case attack:
  480. for(int i = ; i<=roledata.maxcut_attack ; i++)
  481. {
  482. char donghuaurl[] = {};
  483. sprintf(donghuaurl,"%s01%03d.png",roledata.spiritUrl_attack->getCString(),i);
  484. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  485. }
  486. break;
  487. case magicup:
  488. for(int i = ; i<=roledata.maxcut_magic ; i++)
  489. {
  490. char donghuaurl[] = {};
  491. sprintf(donghuaurl,"%s01%03d.png",roledata.spiritUrl_magic->getCString(),i);
  492. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  493. }
  494. break;
  495. case death:
  496. break;
  497. case funny:
  498. break;
  499. default:
  500. break;
  501. }
  502. break;
  503. case left_up:
  504. switch (roledata.acttodo)
  505. {
  506. case run:
  507. for(int i = ; i<=roledata.maxcut_pao ; i++)
  508. {
  509. char donghuaurl[] = {};
  510. sprintf(donghuaurl,"%s02%03d.png",roledata.spiritUrl_pao->getCString(),i);
  511. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  512. }
  513. break;
  514. case stand:
  515. for(int i = ; i<=roledata.maxcut_zhan ; i++)
  516. {
  517. char donghuaurl[] = {};
  518. sprintf(donghuaurl,"%s02%03d.png",roledata.spiritUrl_zhan->getCString(),i);
  519. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  520. }
  521. break;
  522. case attack:
  523. for(int i = ; i<=roledata.maxcut_attack ; i++)
  524. {
  525. char donghuaurl[] = {};
  526. sprintf(donghuaurl,"%s02%03d.png",roledata.spiritUrl_attack->getCString(),i);
  527. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  528. }
  529. break;
  530. case magicup:
  531. for(int i = ; i<=roledata.maxcut_magic ; i++)
  532. {
  533. char donghuaurl[] = {};
  534. sprintf(donghuaurl,"%s02%03d.png",roledata.spiritUrl_magic->getCString(),i);
  535. thisdonghua->addSpriteFrameWithFileName(donghuaurl);
  536. }
  537. break;
  538. case death:
  539. break;
  540. case funny:
  541. break;
  542. default:
  543. break;
  544. }
  545. break;
  546. default:
  547. break;
  548. }
  549.  
  550. return thisdonghua;
  551. }
  552.  
  553. SpiritsPlayer::~SpiritsPlayer(void)
  554. {
  555. }

sprintf(donghuaurl,"%s06%03d.png",roledata.spiritUrl_pao->getCString(),i);

总体思路就是,我们通过了帧连接的拼接来构成动画,通过我们之前写好的model数据来定义我们任务的朝向等问题

比如00000代表右,01000就代表右上,这个也得根据自己素材的模型来写不同的处理逻辑,万变不离其中;

如果我们的图片是在一张大图的集合中,我们可以同过CCRect来处理获取帧图片方式!

CCAnimation* getNowAnt(MainRoledata roledata);
CCAnimate* updateNowAnt(MainRoledata roledata);

通过这两个方法集合,我们就能获取到八面玲珑的朝向,甚至我们连,后续的动画机制也加入了,比如,跑动,打斗,做各种动作等!

Commen_Direction SpiritsPlayer::getNowPointDir(CCPoint newpoint); //获取朝向

void SpiritsPlayer::moveTomap_dir(CCPoint newpoint) //改变朝向方法

以上两个方法,我们是专门处理,之后精灵移动,移动完之后还得恢复到站立状态,移动过程中改变人物朝向问题!所以要考虑的很清楚

很清晰,思路清楚了,才能方便以后的拓展。

OK了,有了以上的精灵类,将其实例化到一个简单的图片地图上,他就会动了;

添加的时候我们直接addchild方法!!

SpiritsPlayer* role_main = new SpiritsPlayer(basedatas->role_player,1,false);

nowmap->addChild(role_main->npc, 999);

nowmap 暂且可以用一张图片CCSprite代替!!!

下一篇博客我会非常详细的将地图制作方法写出来给大家一起分享,由于其实我之前都是C#,JAVA做的很多,很多地方和细节还需要重构

还需要大家多指点一下,这也是我学习的好机会;

游戏demo及素材下载地址(demo里面包含了所有的素材资料);

http://pan.baidu.com/share/link?shareid=4012433582&uk=4097703620&third=15

ps:广告我建了一个QQ群:和大家一起分享cocos2dx开发经验【41131516】

【cocos2d-x 手游研发----精灵的八面玲珑】的更多相关文章

  1. 【cocos2d-x 手游研发----地图活起来了】

    谈到地图不少人都说要做地图编辑器了,但是我暂时绕过这一步,如果不用寻路地图就不能移动?寻路就是会绕过障碍物的算法. 我做了一个简单的地图的思想,就是地图分层3层:背景层.可行区域层.遮罩层,但是地图就 ...

  2. 【cocos2d-x 手游研发----目录】

    感谢大家一直支持我写这样一系列的博客,从中我自己也获益良多,cocos2d-x这样一款非常棒的引擎,是值得我们去学习和分享的,谈到分享,那我就把这套写了差不多一两个月的框架给大家开源下载,写的很一般, ...

  3. 手游研发CJ抱大腿指南

    文摘要:CJ来了,又是一年一度的游戏圈盛事,随着手游行业的迅速崛起,今年CJ上,手游研发商以及发行商必定成为焦点.由于门槛低.市场热.前景好等因素的影响,国内一下子蹦出一大堆手游研发团队.很幸运(或者 ...

  4. 【cocos2d-x 手游研发----研发思路及感想】

          我半年前进入了目前的这家做教育行业的公司(在此之前一直从事原生态开发手游的迷茫之路),学习是一件很快乐的事情,来到这家公司我有了很多时间去学习,不管是公司业务,还是其他技术相关的.于是开始 ...

  5. 【cocos2d-x 手游研发----界面UI设计】

    简单探讨一下如何在cocos2d-x的游戏引擎里面去制作各做交互UI界面,常见的UI如下: 人物头像,血条值,经验条,技能按钮,以及各种玩家交互的界面按钮:背包,人物属性,门派,等: 类似上面的图示交 ...

  6. 【cocos2d-x 手游研发小技巧(6)聊天系统+字体高亮】

    转载请注明出处:http://www.cnblogs.com/zisou/p/cocos2dxJQ-6.html 聊天系统在手机网游中是最常见的交互工具,大家在一起边玩游戏边聊天岂不乐哉: 废话不多了 ...

  7. 【cocos2d-x 手游研发小技巧(1)自定义制作怪物伤害数值】

    直插主题了,今天写了一下午,早就想要写这类似东西的,首先我不会选用CCLabelAtlas了,我直接用帧图片做. 首先我们要准备素材,我先把素材帖出来给大家: 这个是一张比较全的素材图,它包含了扣血的 ...

  8. 【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】

    游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePack ...

  9. 【cocos2d-x 手游研发小技巧(5)获取网络图片缓存并展示】

    今天是年前最后一天上班了,最后一天上班,祝大家马上有各种东西,最后一天也给写一点干货,就是获取网络图片: 经过自己简单封装了一下,实现了获取网络图片,按照比例展示出来,实现方法是cocos2dx - ...

随机推荐

  1. Python 安装路径, dist-packages 和 site-packages 区别

    Stack Overflow's answer 译: dist-packages is a Debian-specific convention that is also present in its ...

  2. SqlDataHelper

    using System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using S ...

  3. Kafka记录Nginx的POST请求

    最近因为工作原因,需要将Nignx的POST请求数据实时采集到Kafka中.最容易的想到的方案就是通过"tail -f" Nginx的log日志到Kafka的Broker集群中,但 ...

  4. 765A Neverending competitions

    A. Neverending competitions time limit per test 2 seconds memory limit per test 512 megabytes input ...

  5. How to use jQuery countdown plugin

    Install We provide two installation methods: Bower bower install jquery.countdown Manual Download th ...

  6. OSGi 系列(十二)之 Http Service

    OSGi 系列(十二)之 Http Service 1. 原始的 HttpService (1) 新建 web-osgi 工程,目录结构如下: (2) HomeServlet package com. ...

  7. 使用dos 作为中介实现cpython 和c# 交互

    最近在使用python 处理一些图形的东西. 实现:对一些512 的图进行像素遍历RGBA 变量, 查询通道不是 255 255 255 颜色 的矩阵,进行切图到空白 之前使用c#进行 确实快10 倍 ...

  8. 2018.10.14 loj#6011. 「网络流 24 题」运输问题(费用流)

    传送门 费用流入门题. 直接按照题意模拟. 把货物的数量当做容量建边. 然后跑一次最小费用流和最大费用流就行了. 代码: #include<bits/stdc++.h> #define N ...

  9. yii2 控制器的生命周期

    控制器生命周期 http://www.yii-china.com/doc/guide/structure_controllers.html 处理一个请求时,应用主体 会根据请求路由创建一个控制器,控制 ...

  10. python获取目录下所有文件

    #方法1:使用os.listdir import os for filename in os.listdir(r'c:\\windows'): print filename #方法2:使用glob模块 ...