level 12
因为使用jass来示范LocalPlayer,所以需要一定的jass基础才可以
#~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨~¨#
第一节:令人迷惑之GetLocalPlayer()
GetLocalPlayer(),顾名思义,是获取本地玩家的函数。其原形如下:
native GetLocalPlayer takes nothing returns player
那么什么是“获取本地玩家”呢?这要从WC的多人游戏运行机制说起。Warcraft3(事实上绝大多游戏都一样)在多人联机时,为了减小网络延迟对游戏进
程的影响,每当执行一段指令的时候,并不是主机执行后再把结果发给每个玩家,而是在每个玩家的电脑上分别执行相同的指令。因此每个玩家的执行结果都是自己
电脑中独立的结果。一般情况下,由于执行的指令和各参数相同,每个玩家会获得相同的结果,即使是计算随机数也不例外(因为“随机数”其实是由“种子”确定
性地计算出来的),所以每个玩家看到的游戏还是相同的。然而有一些情况会使得每个玩家的运算结果不同,最重要的情况之一便是这个函数——
GetLocalPlayer。它会返回执行该函数的玩家(也就是你自己),因此每个人会获得他/她在游戏中对应的玩家(的句柄)。
我知道有人要提问了……
“那数据不就不同步了么?不同步不就可以作弊了么?”
玻璃渣当然不可能那么纯洁,而事实上,魔兽有一套自己的同步机制保证游戏能公平地进行下去。如果检测到玩家数据不同步的话,会造成数据分流,玩家和主机的连接就会断开,俗称……掉线了。
“那这个函数有什么用?一调用不就掉线了?”
慢着,这里其实还有东西要解释。所谓“同步”,并不是要保证玩家间的所有数据都保持一致,否则效率还不如在主机上计算完再传输呢。要同步的只是关系到游戏本
身的关键数据,例如游戏中的单位和它的位置生命等各项属性、玩家资源、游戏时间等等,而GetLocalPlayer的返回值,玻璃渣说了,who
cares。
顺便一说的是,数据只在必要的时候才同步检查。例如某玩家修改了金钱,则只在该玩家购买Ta本来买不起的东西的时候才掉线,
同理单位技能CD,仅在施放本来不能释放的技能时掉线。所以作为一个weer,有时候地图出现了掉线,要考虑到有可能很久以前数据分歧就产生了,只是一直
没机会检查而已。
以上,关于同步的背景介绍完毕,接下来是正题。
2012年01月25日 13点01分