原文:
要实现一个超大的地图,地面不能是完全一样的,要有道路、草地、树、花和几种房屋(非任务用),如果存储的话,仅地面的材质就要用千万行了,所以想找一个节约一点的做法。(由于地图超大,树的数量也会很多的)
摘要:
需求大概是这样:设想一个跑不到边的场景,几乎可以一直向东跑,一年都碰不到边(两年也许可以)。路上会遇到《暗黑》那样的栅栏、树、道路和草地。在服务器端随机产生场景很容易,但要求效率够高,而且某些内容必须是“自然”合理的,以减少检验。如果在服务器端存储,则会占用很大空间,所以至少不能全部存储。另外要保证一致性,即在玩家突然又向西跑的时候,不能让他看到环境变化很大,而且不能让他发现地图不是他跑过来时看到的样子。在玩家移动中动态传输这样的大地图(一部分)也不难,但是如果存在某种生成算法,就可以不传输地图或只传输生成某块使用的种子,让客户端再现地图的生成过程,并且保证服务器的判断依据(例如:能不能穿越)和用户看到的一致。
目前大家比较认可的具有随机地图的游戏包括:《暗黑》、《帝国》、《红警》,偶认为《英雄无敌》也相当好,但速度太慢。而且以上这些都要求存储地图。
基本结构:
将地图上的内容抽象为几个层:
1) 地面/地貌,包括草地、碎石、黏土、熔岩等,允许有细微的高度差异
2) 地貌衍生物,如草地上有花儿,碎石地上有小石块,熔岩上有燃烧的小火堆,黏土上有小坑洞等,外形上不同,但要符合逻辑(比如熔岩上不会开花儿)
3) 植被/阻隔物,阻挡人物的移动,和地面相关,比如树、巨石、巨大火堆等。
4) 建筑物,阻挡人物移动,且有可能存在“传送点”或切换场景的出口。
5) 道路,连接建筑物或聚集的阻隔物。应该不能是直线。
6) 其他非阻隔物,如传送站等
7) 其他阻隔物,如NPC
生成算法目前有以下思路:
1) 全部或分块生成,做无依赖性的修正(分块间不互相引用)
2) 采用模板生成最关键的部分,用伪随机数生成次要部分
模板方式是最切实可行的,全部分块生成法可以将存储和传输降到最小,但目前仍未有可行的方法。
[
本帖最后由 necrocoder 于 2007-8-21 21:13 编辑 ]