副本
副本其实不过是空间实例的一种。前面所有的空间实例,基本上,都是开放的,任何玩家都可以进去,进去之后相互可以看见,只要服务器负载允许(当然,在有的情况下还要你交了费)。我们可以把它们称为公共空间。但有的时候,空间有仅向指定的人群开放的需要。在此空间里,进入的玩家(们)可以不受其它玩家(们)干扰地完成任务。这种空间实例,就好像专门为有限的玩家制作的拷贝,所以叫做副本。通常,这是给玩家升级长经验用的操练场。副本进入的方式类似空间切换。
副本和公共空间实例的差别只在于,玩家进入副本空间的时候,进入的是为他(们)新创建的空间实例,而进入公共空间的时候,进入的是同一个(而且通常是事先创建好的)空间实例。
我们通常管一个空间实例叫做场景,它包含了空间中的所有动态与静态信息的总和。
地图
一个空间,就好像空间实例的类对象,可以用一个地图来描述。地图包含空间中所有的静态信息,也是每一份空间实例的起始状态。可以把游戏中的地图看成真实世界中地图的对应物来加以类比。在真实世界中,地图所包含的信息与地图制作商的取向是相关的。比如有的地图制作者可能会在某一片森林区域做个标记,在图例上写着“熊出没”。在游戏地图里也是一样,制作者可以将“人形怪物出没”置入地图中,表示某种怪物出现的区域。
从根本上来讲,地图中包含了可能出现在它所代表的空间中的一切物件的信息,这其中最主要的是种类和位置信息。一般地,在面向对象的设计方法中,物件自身的信息,由物件自身携带,所以地图中主要标明何物出现于何处。再更周密的地图设计中,通常会加入时间信息,也就是说,它会标明何物何时出现于何处。就象好的地图可能会注明“冬季冰雪覆盖,主要交通工具为雪橇”。
现代地图中通常还包含一种非常重要的信息:交通。它会告诉我们哪里是没路的,哪里是有路的。有路的地方,它会告诉我们是水路还是陆路,公路还是铁路,等等。在游戏地图里面也是一样,携带着路径和障碍信息。实际上,交通信息告诉我们的,就是如何到达某个物件的方法。所以,地图中的信息标明何物何时出现于何处可以何种方式到达。
地图信息也可以设计得非常简单,这会使地图管理变得容易,但是,有的工作是不可消除的,它们不过是被转移到其它管理过程而已。地图的设计,当然与整个系统的分工有关系。
不要把地图混同于地表。地表只是地图的一部分,而且往往是非关键的部分。我们将在后面再来处理它。
玩家
地图代表了空间实例的类对象,所以有了地图,空间实例就可以被创建。空间实例被创建以后,玩家就可以进入该空间实例(以后我们称空间实例为场景好了)。一个玩家可以进入场景,另一个玩家当然也可以进入,网游生来就不是设计给一个人玩的(副本状态毕竟是小概率场景,仅服务于特定目的)。两个玩家都进入同一个场景,这当然不是什么问题。如果他们刚好不在同一个屏幕上,那就更没有什么问题。问题是,玩家进入一个场景,不是为了呆在原地观赏风景,他付钱的目的是为了进来探索一个未知的世界,当然也包括和另一个探索者进行交互。所以,玩家会在场景中移动,他们会彼此遇见,友好的会彼此交谈,成为朋友,结成团队,敌对的会互相回避,或者进行战斗。当玩家相遇在场景中的时候,彼此都进入了对方的视野。这时候,双方都应该看到对方,以及周围几乎相同的场景。如果玩家A在玩家B的东面,那么两个玩家看到的屏幕上,都应该有相同的位置分布。如果玩家A此时被一个怪物追杀,那么玩家B也应该能看到这些。如果玩家A向玩家B发起攻击,可是玩家B还没察觉,问题就更大了。当场景中的玩家增加的时候,这个问题会变得更为复杂。
这就带来了网游的一个基本问题:不同玩家所观察到的(局部,因为玩家的视野通常小于整个场景)场景需要同步。这个问题虽然基本,但并不是一个简单的问题。凡是涉及到多方协作的问题,都不是简单的问题。
NPC
不仅玩家之间要同步,玩家和服务器也需要场景同步。因为NPC是不由玩家控制的角色,它们有服务器管理。所以,应该把服务器看成一个超级玩家,他同时控制着一个场景中的全部NPC的生老病死。作为这样一个玩家,它和普通的玩家之间也存在着同步的问题。
一般而言,NPC之间是不需要交互的。NPC和PC之间的交互主要有对话和作战。
所以
我们首先来处理场景同步的问题。这个问题处理好了,其它的问题会退化成单机游戏的问题。单机游戏的问题,因为其是一个闭合过程,虽然有很多技术上的难题需要处理,但是由于去掉了相互的影响,我倾向于认为没有那么棘手。
这个问题留给下一回,今天有点累了。
