【cocos2d-x 手游研发----精灵的八面玲珑】
继续上一篇文章继续聊吧,这章内容会比较多,也会附上代码,很多朋友加了群,大家在群里面探讨了很多东西,这让大家都觉得受益匪浅,这便是极好的,废话不多了,精灵是游戏的重要组成部分,那ARPG里面的精灵必然是要做得很细的,因为精灵要能动,能跑,能打,甚至要能做各种交互动作等等。
大家可以看一下下面的题,是精灵制作的流程思路:
上图的人物素材来自于网络流传的梦幻西游,地图还有其他素材是以前公司同事制作的,如果游戏正式上线,会换一套完整的自制的素材。图中大家可以看到一个人物有很多部件组合而成,高端一点的游戏甚至部件多达几十上百种,甚至做出骨骼动画。不过以我现在的做法是按照帧动画方式实现各个人物的动作,人物的body部分细节处理会很多,还有大家看到图中的字体(字体渲染描边,我做的是最简单的了,两个LABEL合成在一起,效果能达到就行),由于人物要有方向,而且我们一次性就做8方向的人物动画,那就需要8个方向的连帧图片:
首先,要组装起来我们首先要建一个实体角色类,这个类里面不放别的,就统一放角色的部件属性:
- MainRoledata.h类
- #ifndef _MAIN_ROLE_DATA_
- #define _MAIN_ROLE_DATA_
- #include "cocos2d.h"
- #include "../Commen_ActionToDo.h"
- #include "../Commen_Direction.h"
- USING_NS_CC;
- class MainRoledata
- {
- public :
- //人物的TAG
- int tags;
- //人物姓名
- CCString* spiritname;
- //人物初始坐标
- CCPoint nowpoint;
- //人物默认像素图
- CCString* spiritUrl;
- //人物站立像素图路径
- CCString* spiritUrl_zhan;
- //人物跑动像素图路径
- CCString* spiritUrl_pao;
- //人物攻击像素图路径
- CCString* spiritUrl_attack;
- //人物施法像素图路径/增加人物BUF
- CCString* 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_Direction
- {
- up=,
- down=,
- lefts=,
- rigth=,
- rigth_up=,
- rigth_down=,
- left_down=,
- left_up=
- };
- enum Commen_ActionToDo
- {
- run=,
- stand=,
- attack=,
- death=,
- funny=,
- magicup=
- };
OK,然后配置精灵数据,建了一个GetNPCData.cpp,GetNPCData.h,主要就是拿来初始化数据,大致的思路是要将上面的Model填充数据,相信大家
能够用很多种方式去实现,填充数据(读取XML配置文件,直接写在代码中配置);
接下来我们正式组装完整的八面玲珑的精灵,建立SpiritsPlayer.cpp,SpiritsPlayer.h;
文件内容如下:
- #ifndef _SPIRIT_PLAYER_
- #define _SPIRIT_PLAYER_
- #include "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:
- CCSprite* 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 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移动完成的回调
- 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;
- CCActionInterval* 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"
- #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 = ;
- npc = SpiritsPlayer::create(roledata.spiritUrl->getCString());
- if(npc==NULL)
- {
- CCLog("图层路径有误,请检查路径");
- return;
- }
- //设置NPC初始位置坐标(该坐标取决于当前画层)
- npc->setPosition(roledata.nowpoint);
- //NPC动画设置
- playdonghua = SpiritsPlayer::updateNowAnt(roledata);
- npc->runAction(playdonghua);
- /**开始添加角色各部件**/
- //添加角色名称
- CCLabelTTF* label = CCLabelTTF::create(roledata.spiritname->getCString(), "微软雅黑",);
- label->setColor(ccWHITE);
- label->setDirty(true);
- label->setPosition(ccp(npc->getContentSize().width/,npc->getContentSize().height+));
- CCLabelTTF* labelback = CCLabelTTF::create(roledata.spiritname->getCString(), "微软雅黑",);
- labelback->setColor(ccBLACK);
- labelback->setDirty(true);
- labelback->setPosition(ccp(npc->getContentSize().width/+,npc->getContentSize().height+-));
- //添加NPC人物脚下阴影
- yinzi = CCSprite::create(p_yinzi);
- if(yinzi==NULL)
- {
- CCLog("图层路径有误,请检查路径");
- return;
- }
- if(zhujiaoflag==true)
- {
- yinzi->setPosition(ccp(npc->getContentSize().width/,));
- }
- else
- {
- yinzi->setPosition(ccp(npc->getContentSize().width/,));
- }
- npc->addChild(yinzi,-,);
- npc->addChild(label,,);
- npc->addChild(labelback,,);
- }
- cocos2d::CCRect SpiritsPlayer::rect()
- {
- //获取精灵区域大小
- return CCRectMake(npc->getPositionX()- npc->getContentSize().width * npc->getAnchorPoint().x,npc->getPositionY()-npc->getContentSize().height* npc->getAnchorPoint().y,npc->getContentSize().width, npc->getContentSize().height);
- }
- bool SpiritsPlayer::isTouchInside(CCPoint thisPos)
- {
- CCPoint localPos = thisPos;
- CCRect rc = rect();
- bool isTouched = rc.containsPoint(localPos);
- if (isTouched == true) {
- CCLog(FontChina::G2U("触发点击"));
- }else
- {
- CCLog(FontChina::G2U("未点击"));
- }
- return isTouched;
- }
- void SpiritsPlayer::Spirits_talkabout_hid()
- {
- CCLog(FontChina::G2U("************调用了*****************"));
- }
- CCAnimate* SpiritsPlayer::updateNowAnt(MainRoledata roledata)
- {
- //NPC动画
- CCAnimation* donghua = SpiritsPlayer::getNowAnt(roledata);
- if(roledata.actiontime>)
- {
- donghua->setDelayPerUnit(roledata.actiontime/roledata.maxcut_zhan);
- }
- else
- {
- donghua->setDelayPerUnit(2.0f/15.0f);//执行默认时间
- }
- donghua->setRestoreOriginalFrame(true);
- donghua->setLoops(-);
- CCAnimate* playdonghua = CCAnimate::create(donghua);
- return playdonghua;
- }
- /*************
- * 主角位移移动
- *************/
- void SpiritsPlayer::moveTomap_move(int uestime, CCPoint newpoint,bool npcflag)
- {
- if(npcflag==true)
- {
- actbackfun = CCCallFunc::create(this, callfunc_selector(SpiritsPlayer::moveoverCallBackforNpc));
- }
- else
- {
- actbackfun = CCCallFunc::create(this, callfunc_selector(SpiritsPlayer::moveoverCallBack));
- }
- movemethod(uestime,newpoint);
- }
- void SpiritsPlayer::movemethod(int uestime,CCPoint newpoint)
- {
- npc->stopAction(actall);
- act_moveto_npc = CCMoveTo::create(uestime,ccp(newpoint.x,newpoint.y+));
- actall = CCSequence::create(act_moveto_npc,actbackfun,NULL);
- npc->runAction(actall);
- }
- /*************
- * 改变移动方向
- *************/
- void SpiritsPlayer::moveTomap_dir(CCPoint newpoint)
- {
- GetNPCData npcdata = GetNPCData();
- npcdata.GetNPCchapter1();
- move_dir=SpiritsPlayer::getNowPointDir(newpoint);
- npcdata.role_player.dir=move_dir;
- npcdata.role_player.acttodo = run;
- npcdata.role_player.actiontime=0.5;
- npc->stopAction(playdonghua);
- playdonghua = SpiritsPlayer::updateNowAnt(npcdata.role_player);
- npc->runAction(playdonghua);
- }
- /*************
- * 根据点击坐标获得人物的朝向
- *************/
- Commen_Direction SpiritsPlayer::getNowPointDir(CCPoint newpoint)
- {
- Commen_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 = size.width/;
- center_y = size.height/;
- npc_x = npc->getPositionX();
- npc_y = npc->getPositionY();
- move_x = (int)(npc_x -newpoint.x );
- move_y = (int)(npc_y -newpoint.y - );
- if(move_x>=&&move_y<=-)
- {
- //左上
- thisdir = left_up;
- }
- else if(move_x>=&&move_y>=)
- {
- //左下
- thisdir = left_down;
- }
- else if(move_x<=-&&move_y<=-)
- {
- //右上
- thisdir = rigth_up;
- }
- else if(move_x<=-&&move_y>=)
- {
- //右下
- thisdir =rigth_down;
- }
- else if(move_x>-&&move_x<&&move_y>)
- {
- //下
- thisdir =down;
- }
- else if(move_x>-&&move_x<&&move_y<)
- {
- //上
- thisdir =up;
- }
- else if(move_x>&&move_y>-&&move_y<)
- {
- //左
- thisdir = lefts;
- }
- else if(move_x<&&move_y>-&&move_y<)
- {
- //右
- thisdir =rigth;
- }
- return thisdir;
- }
- /*************
- * 移动完成后的回调
- *************/
- void SpiritsPlayer::moveoverCallBack()
- {
- //移动完成之后恢复站立状态
- GetNPCData npcdata = GetNPCData();
- npcdata.GetNPCchapter1();
- npcdata.role_player.dir=move_dir;
- npcdata.role_player.acttodo = stand;
- npcdata.role_player.actiontime=1.1f;
- npc->stopAction(playdonghua);
- playdonghua = SpiritsPlayer::updateNowAnt(npcdata.role_player);
- npc->runAction(playdonghua);
- }
- /*************
- * 普通NPC移动完成后的回调
- *************/
- void SpiritsPlayer::moveoverCallBackforNpc()
- {
- }
- /*************
- * 点击瞬移至此
- *************/
- void SpiritsPlayer::updateNpcPoint(CCPoint newpoint)
- {
- p_ui_name->updataGameText(ccp(newpoint.x,newpoint.y+npc->getContentSize().height/+));
- npc->setPosition(newpoint);
- yinzi->setPosition(ccp(newpoint.x,newpoint.y-npc->getContentSize().height/+));
- }
- /*********************
- * 八方向人物动作合成器
- *********************/
- CCAnimation* SpiritsPlayer::getNowAnt(MainRoledata roledata)
- {
- CCAnimation* thisdonghua = CCAnimation::create();
- switch (roledata.dir)
- {
- case up:
- switch (roledata.acttodo)
- {
- case run:
- for(int i = ; i<=roledata.maxcut_pao ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s06%03d.png",roledata.spiritUrl_pao->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case stand:
- for(int i = ; i<=roledata.maxcut_zhan ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%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:
- switch (roledata.acttodo)
- {
- case run:
- for(int i = ; i<=roledata.maxcut_pao ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s04%03d.png",roledata.spiritUrl_pao->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case stand:
- for(int i = ; i<=roledata.maxcut_zhan ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s04%03d.png",roledata.spiritUrl_zhan->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case attack:
- break;
- case death:
- break;
- case funny:
- break;
- default:
- break;
- }
- break;
- case lefts:
- switch (roledata.acttodo)
- {
- case run:
- for(int i = ; i<=roledata.maxcut_pao ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s05%03d.png",roledata.spiritUrl_pao->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case stand:
- for(int i = ; i<=roledata.maxcut_zhan ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s05%03d.png",roledata.spiritUrl_zhan->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case attack:
- break;
- case death:
- break;
- case funny:
- break;
- default:
- break;
- }
- break;
- case rigth:
- switch (roledata.acttodo)
- {
- case run:
- for(int i = ; i<=roledata.maxcut_pao ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s07%03d.png",roledata.spiritUrl_pao->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case stand:
- for(int i = ; i<=roledata.maxcut_zhan ; i++)
- {
- char donghuaurl[] = {};
- 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;
- }
- break;
- case rigth_up:
- switch (roledata.acttodo)
- {
- case run:
- for(int i = ; i<=roledata.maxcut_pao ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s03%03d.png",roledata.spiritUrl_pao->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case stand:
- for(int i = ; i<=roledata.maxcut_zhan ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s03%03d.png",roledata.spiritUrl_zhan->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case attack:
- for(int i = ; i<=roledata.maxcut_attack ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s03%03d.png",roledata.spiritUrl_attack->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case magicup:
- for(int i = ; i<=roledata.maxcut_magic ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s03%03d.png",roledata.spiritUrl_magic->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case death:
- break;
- case funny:
- break;
- default:
- break;
- }
- break;
- case rigth_down:
- switch (roledata.acttodo)
- {
- case run:
- for(int i = ; i<=roledata.maxcut_pao ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s00%03d.png",roledata.spiritUrl_pao->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case stand:
- for(int i = ; i<=roledata.maxcut_zhan ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s00%03d.png",roledata.spiritUrl_zhan->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case attack:
- for(int i = ; i<=roledata.maxcut_attack ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s00%03d.png",roledata.spiritUrl_attack->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case magicup:
- for(int i = ; i<=roledata.maxcut_magic ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s00%03d.png",roledata.spiritUrl_magic->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case death:
- break;
- case funny:
- break;
- default:
- break;
- }
- break;
- case left_down:
- switch (roledata.acttodo)
- {
- case run:
- for(int i = ; i<=roledata.maxcut_pao ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s01%03d.png",roledata.spiritUrl_pao->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case stand:
- for(int i = ; i<=roledata.maxcut_zhan ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s01%03d.png",roledata.spiritUrl_zhan->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case attack:
- for(int i = ; i<=roledata.maxcut_attack ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s01%03d.png",roledata.spiritUrl_attack->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case magicup:
- for(int i = ; i<=roledata.maxcut_magic ; i++)
- {
- char donghuaurl[] = {};
- 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:
- switch (roledata.acttodo)
- {
- case run:
- for(int i = ; i<=roledata.maxcut_pao ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s02%03d.png",roledata.spiritUrl_pao->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case stand:
- for(int i = ; i<=roledata.maxcut_zhan ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s02%03d.png",roledata.spiritUrl_zhan->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case attack:
- for(int i = ; i<=roledata.maxcut_attack ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s02%03d.png",roledata.spiritUrl_attack->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case magicup:
- for(int i = ; i<=roledata.maxcut_magic ; i++)
- {
- char donghuaurl[] = {};
- sprintf(donghuaurl,"%s02%03d.png",roledata.spiritUrl_magic->getCString(),i);
- thisdonghua->addSpriteFrameWithFileName(donghuaurl);
- }
- break;
- case death:
- break;
- case funny:
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
- return thisdonghua;
- }
- SpiritsPlayer::~SpiritsPlayer(void)
- {
- }
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 手游研发----精灵的八面玲珑】的更多相关文章
- 【cocos2d-x 手游研发----地图活起来了】
谈到地图不少人都说要做地图编辑器了,但是我暂时绕过这一步,如果不用寻路地图就不能移动?寻路就是会绕过障碍物的算法. 我做了一个简单的地图的思想,就是地图分层3层:背景层.可行区域层.遮罩层,但是地图就 ...
- 【cocos2d-x 手游研发----目录】
感谢大家一直支持我写这样一系列的博客,从中我自己也获益良多,cocos2d-x这样一款非常棒的引擎,是值得我们去学习和分享的,谈到分享,那我就把这套写了差不多一两个月的框架给大家开源下载,写的很一般, ...
- 手游研发CJ抱大腿指南
文摘要:CJ来了,又是一年一度的游戏圈盛事,随着手游行业的迅速崛起,今年CJ上,手游研发商以及发行商必定成为焦点.由于门槛低.市场热.前景好等因素的影响,国内一下子蹦出一大堆手游研发团队.很幸运(或者 ...
- 【cocos2d-x 手游研发----研发思路及感想】
我半年前进入了目前的这家做教育行业的公司(在此之前一直从事原生态开发手游的迷茫之路),学习是一件很快乐的事情,来到这家公司我有了很多时间去学习,不管是公司业务,还是其他技术相关的.于是开始 ...
- 【cocos2d-x 手游研发----界面UI设计】
简单探讨一下如何在cocos2d-x的游戏引擎里面去制作各做交互UI界面,常见的UI如下: 人物头像,血条值,经验条,技能按钮,以及各种玩家交互的界面按钮:背包,人物属性,门派,等: 类似上面的图示交 ...
- 【cocos2d-x 手游研发小技巧(6)聊天系统+字体高亮】
转载请注明出处:http://www.cnblogs.com/zisou/p/cocos2dxJQ-6.html 聊天系统在手机网游中是最常见的交互工具,大家在一起边玩游戏边聊天岂不乐哉: 废话不多了 ...
- 【cocos2d-x 手游研发小技巧(1)自定义制作怪物伤害数值】
直插主题了,今天写了一下午,早就想要写这类似东西的,首先我不会选用CCLabelAtlas了,我直接用帧图片做. 首先我们要准备素材,我先把素材帖出来给大家: 这个是一张比较全的素材图,它包含了扣血的 ...
- 【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】
游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePack ...
- 【cocos2d-x 手游研发小技巧(5)获取网络图片缓存并展示】
今天是年前最后一天上班了,最后一天上班,祝大家马上有各种东西,最后一天也给写一点干货,就是获取网络图片: 经过自己简单封装了一下,实现了获取网络图片,按照比例展示出来,实现方法是cocos2dx - ...
随机推荐
- Python 安装路径, dist-packages 和 site-packages 区别
Stack Overflow's answer 译: dist-packages is a Debian-specific convention that is also present in its ...
- SqlDataHelper
using System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using S ...
- Kafka记录Nginx的POST请求
最近因为工作原因,需要将Nignx的POST请求数据实时采集到Kafka中.最容易的想到的方案就是通过"tail -f" Nginx的log日志到Kafka的Broker集群中,但 ...
- 765A Neverending competitions
A. Neverending competitions time limit per test 2 seconds memory limit per test 512 megabytes input ...
- How to use jQuery countdown plugin
Install We provide two installation methods: Bower bower install jquery.countdown Manual Download th ...
- OSGi 系列(十二)之 Http Service
OSGi 系列(十二)之 Http Service 1. 原始的 HttpService (1) 新建 web-osgi 工程,目录结构如下: (2) HomeServlet package com. ...
- 使用dos 作为中介实现cpython 和c# 交互
最近在使用python 处理一些图形的东西. 实现:对一些512 的图进行像素遍历RGBA 变量, 查询通道不是 255 255 255 颜色 的矩阵,进行切图到空白 之前使用c#进行 确实快10 倍 ...
- 2018.10.14 loj#6011. 「网络流 24 题」运输问题(费用流)
传送门 费用流入门题. 直接按照题意模拟. 把货物的数量当做容量建边. 然后跑一次最小费用流和最大费用流就行了. 代码: #include<bits/stdc++.h> #define N ...
- yii2 控制器的生命周期
控制器生命周期 http://www.yii-china.com/doc/guide/structure_controllers.html 处理一个请求时,应用主体 会根据请求路由创建一个控制器,控制 ...
- python获取目录下所有文件
#方法1:使用os.listdir import os for filename in os.listdir(r'c:\\windows'): print filename #方法2:使用glob模块 ...