作者:Flysky 2005 上一篇我们讲了地图的结构和地图的基本的绘制,这个属于较简单的步骤,我做这些也不是特别的麻烦,如果你是老手,那么1天对你来说已经足够,我们这一组文章也没有讲任何的优化技巧,如果你想优化,还是需要在实际中摸索,当然,我有时间也会写的。 这一篇我们主要研讨地图的物品、景物、NPC建立,并说一下遮挡的简单实现方法。 NPC\主角结构: 主角和NPC在一起比较好,也便于管理(再次声明:作者已经不使用这些方法,这些方法只适用于初学者!),结构如下: struct stRoleC { //判断 bool IsNPC; //是不是NPC //----------Role基本-------------- char *Name; //NPC名字 bool VS; //是否有这个人物(是否可见) int x,y; //人物的XY坐标值 RECT roler; //人物矩形 int face; //NPC面向的方向 0. 下 1. 上 2.左 3.右 char *facePic; //----------属性值------------- int HP,MP; //目前的HP,MP int MaxHP,MaxMP; //满HP和MP int Level; //目前的等级 int Exp; //目前的经验 int MaxExp; //满血的经验 //----------寻路相关-------------- bool move; int movex,movey; //移动目标点 //----------NPC相关--------------- char *EScrFName; //当触发人民的脚本文件名 }; struct stRole { //判断 bool IsNPC; //是不是NPC //----------Role基本-------------- char Name[32]; //NPC名字 bool VS; //是否有这个人物(是否可见) int x,y; //人物的XY坐标值 int oldx,oldy; //人物上一步的XY值 RECT roler; //人物矩形 POINT PicS; //距像素坐标的偏移 int face; //NPC面向的方向 0. 下 1. 上 2.左 3.右 bool facejd; //上一步的站向 char facePic[64]; int facej; //NPC方向的脚步 0 1 2 3 vector<POINT> zd; //遮挡列表 //----------属性值------------- int HP,MP; //目前的HP,MP int MaxHP,MaxMP; //满HP和MP int Level; //目前的等级 int Exp; //目前的经验 int MaxExp; //满血的经验 //----------寻路相关-------------- bool move; vector<POINT> Path; //各个步数 int PathSteps; //步数 int PathCSteps; //已经走过步数 int movex,movey; //移动目标点 //----------NPC相关--------------- char *EScrFName; //当触发人民的脚本文件名 bool WalkLoop; //是向前走还是倒退 //----------Surface-------------- LPDIRECTDRAWSURFACE7 lpDDS_ROLEP; //Role的图片 LPDIRECTDRAWSURFACE7 lpDDS_ROLEL; //Role的logo }; 这两个结构其中stRole是内部储存的结构,而stRoleC是对外的接口,其实你完全不必那样,用一个也可以,具体的完全随你便。 注意:以下的代码和KGameSrc一点关系也没有。 景物的建立: struct st_scene { int x,y; //房子等东西右下角的坐标 int Width,Height; //物品的大小,利用这个可以选出房子等左上角的坐标 LPDIRECTDRAWSURFACE7 lpDDS_SCENEPIC; //房子等的图片 unsigned short b_isablock; //0: 不阻碍 1: 全部阻碍 2:使用阻碍表 struct {unsigned int data;}**v_block; //阻碍表,比如房子,门那里是不遮挡的 //注意:因为我们构件的是<<魔力宝贝>>式,所以陷阱并不是归这里 }; 我也注释了,应该很好看吧。 遮挡问题: 这个确实比较棘手,如果是单格遮挡,可以看云风的遮挡算法,可我们是多个格的,怎么办呢? 根据几位前辈的讨论,他们想出了使用X+Y算法(画家算法),但当时不是很成功,我就做一下补充。 首先,把地图上的一切东西(不管是物品还是主角)串成一个链表(遮挡链表),然后根据X+Y的值有小到大(左上到右下)排列,最后绘制,这样就完成了,很简单吧(哪位可以帮我画一下图,感激不尽.) 优化方法也有:那就是这个景物的排列让地图编辑器排列,然后这个不动了,光人物在链表中的位置移动,这样就完成了快速遮挡。 好了,基本的东西我也写完了,由于现在我在做操作系统,语言说的太急,下一次我会把更好的优化代码和例子程序给大家,谢谢大家观看! |