|
发表于 2005-9-23 13:01:00
|
显示全部楼层
Re:浅析WOW里的怪物仇恨
作个比方,每个怪物用一个数据结构存放数据,比如struct mob,那么我们可以用这样的存储办法:
typedef struct moblist
{
struct mob *p_mobData;
struct moblist *p_nextMob;
} t_MOB,*tp_MOB;
这个结构初始化后就可以作为1个链表里面的1个节点(node),他的成员指针p_nextMob用来指向下一个节点(同样的一个怪物结构,表示另外一个怪物),而这个节点表示的怪物的数据和操作可以通过 p_mobData来获得和操作.
在游戏初始化的时候,我们定义一个list指针来构建这个地图的所有怪物的数据列表:
tp_MOB allMob;
假如我们有3个不同的怪物,我们用mob_init()函数来初始化得到每个怪物的结构:
tp_MOB mob_init(....)
{
.....
}
然后我们使用addnode(tp_MOB)来把怪物加进allMob列表:
bool addnode(tp_MOB)
{
isLegal(tp_MOB); /*判断数据合法性*/
p_listEnd->p_nextMob=tp_MOB; /*把这个怪物加入链表的尾节点的下个位置*/
return true;
}
这样我们就得到了类似下面的怪物结构 A->B->C(ABC是三个不同的怪物数据)
服务器处理的时候通过遍历这个链表来处理这个地图的所有怪物,遍历的意思就是从allMob第一个节点一直向下处理,每一次遍历可以用下面的代码实现:
bool mobDeal()
{
tp_MOB p_currentMob;
while(p_currentMob!=NULL)
{
if(Deal(p_currentMob->p_mobData)) /*处理当前的怪物数据*/
{
P_currentMob= P_currentMob->p_nextMob;/*成功处理后将当前处理节点移到下个节点*/
}
else
{
P_error(); /*失败转错误处理*/
}
}
}
通过不断循环调用这个函数来不断处理所有怪物数据.
上面代码都是伪代码,就是给楼上兄弟解释节点和遍历,很多东西都没考虑到,大家继续讨论. |
|