游戏开发论坛

 找回密码
 立即注册
搜索
楼主: netdragonx

[讨论] 浅析WOW里的怪物仇恨

[复制链接]

0

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
QQ
发表于 2005-9-23 12:04:00 | 显示全部楼层

Re:浅析WOW里的怪物仇恨

如果是这样,可以解释FB里面的问题,在FB中的所有怪物和玩家相比整块地图(或者以区域分割的小地图)的怪物和玩家的数量要少的多,服务器将单独开辟线程来处理这块区域,怪物list和玩家list的长度要小的多,服务器2次遍历同样一个怪物节点和玩家节点的速度也快的多,导致FB怪物应该是比外面的怪物要灵敏的(不排除甚至可能按怪物种类列list,比如BOSS和精英和普通分成3个链表,这样导致长度更小,遍历速度更快,这样还可以设置机制来优先遍历BOSS链表,导致BOSS比正常的怪物更灵敏).WOW怪物灵敏还把玩家等级也考虑进去了,这个其实在处理每个怪物的仇恨表时候会作为考虑因素之一.

57

主题

1523

帖子

1583

积分

金牌会员

Rank: 6Rank: 6

积分
1583
发表于 2005-9-23 12:11:00 | 显示全部楼层

Re:浅析WOW里的怪物仇恨

恩恩,楼上的很专业,一些词语不太懂

“遍历”和“节点”可否解释下意思,虽然能猜到些意思

135

主题

3447

帖子

3800

积分

论坛元老

总版主

Rank: 8Rank: 8

积分
3800
QQ
发表于 2005-9-23 12:18:00 | 显示全部楼层

Re:浅析WOW里的怪物仇恨

“遍历”和“节点”是数据结构里面的术语,可以看下数据结构与算法的相关资料^^

0

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
QQ
发表于 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(); /*失败转错误处理*/
           }
           
     }
}

通过不断循环调用这个函数来不断处理所有怪物数据.

上面代码都是伪代码,就是给楼上兄弟解释节点和遍历,很多东西都没考虑到,大家继续讨论.

57

主题

1523

帖子

1583

积分

金牌会员

Rank: 6Rank: 6

积分
1583
发表于 2005-9-23 16:23:00 | 显示全部楼层

Re:浅析WOW里的怪物仇恨

恩恩,了解了,多谢多谢

1

主题

130

帖子

134

积分

注册会员

Rank: 2

积分
134
发表于 2005-10-10 12:51:00 | 显示全部楼层

Re:浅析WOW里的怪物仇恨

80格不小了,你想,魔兽世界的地图有多大,同时有多少NPC,你乘一下就知道了

20

主题

873

帖子

883

积分

高级会员

Rank: 4

积分
883
发表于 2005-10-11 09:35:00 | 显示全部楼层

Re:浅析WOW里的怪物仇恨

看来楼上的以为每个怪物都要用80格

41

主题

2104

帖子

2109

积分

金牌会员

Rank: 6Rank: 6

积分
2109
发表于 2005-10-11 09:57:00 | 显示全部楼层

Re:浅析WOW里的怪物仇恨

不可能每次都遍历仇恨列表
那样太费资源了

只要他存下来最大仇恨值,与攻击他的人的仇恨值作比较,来决定是攻击谁
只有施放了消除仇恨的技能才需要遍历一次寻找最大值

0

主题

18

帖子

18

积分

新手上路

Rank: 1

积分
18
QQ
发表于 2005-10-11 11:40:00 | 显示全部楼层

Re:浅析WOW里的怪物仇恨

5秒原则很有可能,因为如果真的存在了这个原则的话,WOW里关于怪物仇恨以及战斗中的一些问题基本都可以顺利解释,而且这么做确实可以减轻服务器负担。我不是学编程的,想请教一点...心跳时间是怎么一回事?
netdragonx说的“如果你4秒站着,第5秒坐下,也可以回相当于坐下的魔与血。”我已有体会。

41

主题

2104

帖子

2109

积分

金牌会员

Rank: 6Rank: 6

积分
2109
发表于 2005-10-11 11:53:00 | 显示全部楼层

Re:浅析WOW里的怪物仇恨

心跳嘛。。就跟领导视察一样,他检查的时候你是坐着的那么他就以为你一直是坐着的,实际上领导不在的时候谁知道你什么样~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-4 02:37

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表