继续上一篇文章继续聊吧,这章内容会比较多,也会附上代码,很多朋友加了群,大家在群里面探讨了很多东西,这让大家都觉得受益匪浅,这便是极好的,废话不多了,精灵是游戏的重要组成部分,那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 手游研发----精灵的八面玲珑】的更多相关文章

  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. 300最长上升子序列 · Longest Increasing Subsequence

    [抄题]: 往上走台阶 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的. 样例 给出 [5,4,1,2,3],LIS 是 [1,2 ...

  2. repeater嵌套RadioButtonList赋值

    <asp:Repeater ID="Repeater1" runat="server"         onitemdatabound="Rep ...

  3. iOS - swift项目接入bugly - 报错, 配置符号表,下载Java环境,

    1.pod 安装,无需配置任何东西 2.终端找到路径: pod install 3.在 appdelegate 导入  import Bugly extension AppDelegate{ /// ...

  4. 在控制台远程连接mysql数据库时,出现ERROR 2049 (HY000)错误

    问题的原因是,你本地的数据库版本过高,而远程的数据库版本低. 解决方法:在连接时加上  --skip-secure-auth 参数就可以了. mysql -h主机 -u用户名 -p密码 --skip- ...

  5. OpenGLES.gpus_ReturnNotPermittedKillClient

    在iOS中,使用OpenGLES不当引起的crash:“gpus_ReturnNotPermittedKillClient” https://developer.apple.com/library/i ...

  6. 建表Table

    Sstudent表   学  号    Sno  姓  名   Sname   性  别    Ssex     年  龄      Sage   所 在 系    Sdept   200215121 ...

  7. How to Set Up an Rsync Daemon on Your Linux Server

    Introduction This tutorial will take you through setting up an rsync daemon on your Linux server. Yo ...

  8. windows 安装配置jdk7

    1.安装jdk这里不在介绍 2.配置新建用户变量:JAVA_HOME 值为(就是你自己jdk的安装路径):C:\Program Files\Java\jdk1.7.0_75\ 3.配置系统变量:Pat ...

  9. DB2通用数据库性能调整的常用方法

    DB2通用数据库性能调整的常用方法 DB2通用数据库性能调整的常用方法 Agenda 统计值更新--runstats  调整Buffer pool  调整日志缓冲区大小  应用程序堆大小  排序堆大小 ...

  10. 2018.08.28 codeforces600E(dsu on tree)

    传送门 一道烂大街的dsu on tree板题. 感觉挺有趣的^_^ 代码真心简单啊! 就是先处理轻儿子,然后处理重儿子,其中处理轻儿子后需要手动消除影响. 代码: #include<bits/ ...