作者:Flysky 2006
这篇文章我们主要讲的是遮挡的详细制作方法,我认为,如果你知道了上面几篇的原理,应该也能制作出来,如果你制作出来了,就请不要往下看了,下面的很可能对你来说是浪费时间。
好,那我们开始吧。
方法一(对前面的那篇文章的改进)
首先我们要学会union的使用,看下面的结构:
typedef struct st_mapunit{
BYTE b_magic; /*魔法数字*/ int x,y; /* 这个图片右下角的坐标 */ int width,height; /* 长度,宽度 */ LPDIRECTDRAWSURFACE7 pic; union{ st_npc npc; /* NPC结构 */ st_things thing; /* 景物结构 */ }u; };
然后我们需要一个类,这个类包括NPC类、景物、显示类,还有一个可变大小的数组,我们可以使用vector类组织这个(或用链表):
vector <st_mapunit> mapunits;
声明两个宏:
#define MAGIC_NPC 0x0001 #define MAGIC_THING 0x0002
这样我们就可以对他们进行排序了,方法也很简单,在KGame V1.0的NPC里面出现过,我认为人物的插入方法很好,但排序算法不是很好,你需要选择更好的方法。
注意:KGameV1.0当时没选用这个方法的原因是因为当时已经写了许多的代码了。
大家应该知道怎么做了吧,大类负责提供接口,小类当然是执行各个的工作了......
方法二
其实这个我也没有试过,但我认为是可行的,但速度可能比上面的差一些(但不多),但这样设计更符合面向对象的方法。
1.分层类建立 这个我们需要链表,先看高级页面类:
class hsurface{ hlayer *hlayer_headle; /* 层次列表的头 */ void addsurface(DWORD x,DWORD y,int layer,LPDIRECTDRAWSURFACE7 surface); /* 添加一个物件 */ LPDIRECTDRAWSURFACE7 delsurface(int x,int y,int layer); /* 删除一个物件 */ void clearhlayer(int layer); /* 清除一个层的所有物件 */ void clearall(); /* 清除所有的东西 */ void draw(int layer,LPDIRECTDRAWSURFACE7 surface); /* 将一个层绘到页面上 */ void draw(LPDIRECTDRAWSURFACE7 surface); /* 所有的层绘到页面上 */ };
现在应该有初步的认识了吧,如果你知道了原理,就不要往下看了(耽误时间)。
struct hlayer{ /* 一个层结构 */ hlayer *next; /* 下一个层的指针 */ int i_layer; /* 这个层的索引值 */ hlayer_object *object_headle; /* 这个层的物件的头 */ };
上面的这个是一个层的结构,层与层之间是成一个链的关系,我们又加上了i_layer这个值,这样我们就可以让两个层之间的值不连续,最后一个便是物件指针的头,我们利用这个进行绘图。
最后一个结构:
struct hlayer_object{ hlayer_object *next; DWORD x,y; /* 这个物件的X/Y值 */ int i_layer; /* 这里大家可能有疑问,上面不时有了吗,这个是个验证值,验证这个物件的正确性 */ LPDIRECTDRAWSURFACE7 surface; /* 这个页面 */ };
这样我们就说明完了,有几点注意的地方:
(1)X/Y值要按照90度的坐标,而不是针对的45度的坐标,这样更有普遍性.(如果你觉得这样就不能遮挡了,那么你再看一遍上面的方法。
(2)我喜欢实现一个内存池,这样建立会更快。
2.将分层类运用到45度的游戏中
i_layer=0 我们保留
每个东西:i_layer=x+y+1
云彩:i_layer=MAX_X+MAX_Y+1(注意,这个X+Y只是一个值,表明按一定的顺序绘图,具体的请看我的45度教程。
什么东西最重要的还是看自己,我只是引了一个路,剩下的好办法还是你自己去挖掘(其实也不难)!!!!
-----以下内容请保留----- 这篇文章的完成版本:http://www.pp28.com.ru/blog/article.asp?id=16
|