支持: 0 | 反对: 0 | 打印 | 推荐 | 订阅 | 收藏
标题: [技术]如何实现随机的超大地图(摘要: 2007-08-21)
necrocoder
骑士
Rank: 24Rank: 24Rank: 24


UID 41915
精华 1
积分 1190
帖子 68
威望 2
现金 3173 银币
金币 0 金币
阅读权限 50
注册 2007-8-10
来自 天津
状态 离线
发表于 2007-8-17 08:24  资料  个人空间  短消息  QQ

[技术]如何实现随机的超大地图(摘要: 2007-08-21)


原文:
要实现一个超大的地图,地面不能是完全一样的,要有道路、草地、树、花和几种房屋(非任务用),如果存储的话,仅地面的材质就要用千万行了,所以想找一个节约一点的做法。(由于地图超大,树的数量也会很多的)



摘要:
需求大概是这样:设想一个跑不到边的场景,几乎可以一直向东跑,一年都碰不到边(两年也许可以)。路上会遇到《暗黑》那样的栅栏、树、道路和草地。在服务器端随机产生场景很容易,但要求效率够高,而且某些内容必须是“自然”合理的,以减少检验。如果在服务器端存储,则会占用很大空间,所以至少不能全部存储。另外要保证一致性,即在玩家突然又向西跑的时候,不能让他看到环境变化很大,而且不能让他发现地图不是他跑过来时看到的样子。在玩家移动中动态传输这样的大地图(一部分)也不难,但是如果存在某种生成算法,就可以不传输地图或只传输生成某块使用的种子,让客户端再现地图的生成过程,并且保证服务器的判断依据(例如:能不能穿越)和用户看到的一致。

目前大家比较认可的具有随机地图的游戏包括:《暗黑》、《帝国》、《红警》,偶认为《英雄无敌》也相当好,但速度太慢。而且以上这些都要求存储地图。

基本结构:
将地图上的内容抽象为几个层:
1) 地面/地貌,包括草地、碎石、黏土、熔岩等,允许有细微的高度差异
2) 地貌衍生物,如草地上有花儿,碎石地上有小石块,熔岩上有燃烧的小火堆,黏土上有小坑洞等,外形上不同,但要符合逻辑(比如熔岩上不会开花儿)
3) 植被/阻隔物,阻挡人物的移动,和地面相关,比如树、巨石、巨大火堆等。
4) 建筑物,阻挡人物移动,且有可能存在“传送点”或切换场景的出口。
5) 道路,连接建筑物或聚集的阻隔物。应该不能是直线。
6) 其他非阻隔物,如传送站等
7) 其他阻隔物,如NPC

生成算法目前有以下思路:
1) 全部或分块生成,做无依赖性的修正(分块间不互相引用)
2) 采用模板生成最关键的部分,用伪随机数生成次要部分
模板方式是最切实可行的,全部分块生成法可以将存储和传输降到最小,但目前仍未有可行的方法。

[ 本帖最后由 necrocoder 于 2007-8-21 21:13 编辑 ]

顶部
[广告] 论坛投票锁帖系统(主题帖投票)启用,会员可以控制帖子的关闭与否
q810105 (血雨)
勋爵
Rank: 40Rank: 40Rank: 40Rank: 40Rank: 40


UID 36040
精华 7
积分 6956
帖子 164
威望 14
现金 3614 银币
金币 0 金币
阅读权限 60
注册 2007-7-11
状态 离线
发表于 2007-8-17 09:20  资料  个人空间  短消息 

咱不是技术,所以不懂!
不过按我们的方法来解决就是:把那些个道路啊、树木啊树木的看成一个元素,我们给他们编号。然后用编号来记录,也就说看上去地图就是一堆的数字,然后在玩家那显示的时候在客户端那实现显示,就是按编号贴上相应的元素。这样应该不大占资源。。。。。。。
呵呵~~我不懂技术,我是学习企划的,所以不要笑啊!o(∩_∩)o...

顶部
[广告] 绿豆蛙四格漫画填字活动
tonger
版主
Rank: 68Rank: 68Rank: 68Rank: 68Rank: 68


UID 2435
精华 0
积分 1448
帖子 84
威望 0
现金 7908 银币
金币 0 金币
阅读权限 120
注册 2006-9-21
状态 离线
发表于 2007-8-17 09:42  资料  个人空间  短消息 

这个在技术上实现是要分这样几步吧:

1、确定图元,所谓图元,就是你说的 道路、草地、树、花和几种房屋  这些东西。

2、确定各种图元的生成比例;

3、随机生成地图,生成时注意一些规则:比如房子不能在水里。。。

一般这样的东西分为2层。地表和建筑。。。

顶部
[广告] 本月CWG有才贴---侦探火狼,孽缘曝光全解析
necrocoder
骑士
Rank: 24Rank: 24Rank: 24


UID 41915
精华 1
积分 1190
帖子 68
威望 2
现金 3173 银币
金币 0 金币
阅读权限 50
注册 2007-8-10
来自 天津
状态 离线
发表于 2007-8-17 11:00  资料  个人空间  短消息  QQ

如果能用一个算法生成貌似随机又比较合理的景物就好了,客户端就不需要下载地图了

顶部
[广告] 论坛投票锁帖系统(主题帖投票)启用,会员可以控制帖子的关闭与否
alp
游戏官方特派
Rank: 68Rank: 68Rank: 68Rank: 68Rank: 68



UID 18496
精华 0
积分 7402
帖子 2053
威望 0
现金 14275 银币
金币 1 金币
阅读权限 100
注册 2007-3-25
状态 离线
发表于 2007-8-17 11:06  资料  个人空间  短消息  QQ

让我想起了红警那个自动生成地图的功能

顶部
[广告] 论坛投票锁帖系统(主题帖投票)启用,会员可以控制帖子的关闭与否
轻狂物语
老兵
Rank: 9Rank: 9


UID 39336
精华 0
积分 220
帖子 51
威望 0
现金 2610 银币
金币 0 金币
阅读权限 30
注册 2007-7-30
状态 离线
发表于 2007-8-17 11:29  资料  个人空间  主页 短消息  QQ

急需这样的技术
有方法的给个答案

顶部
[广告] 论坛红包功能恢复,准骑士以上可评分。结婚系统安装完毕,大家可以开始表白了
alp
游戏官方特派
Rank: 68Rank: 68Rank: 68Rank: 68Rank: 68



UID 18496
精华 0
积分 7402
帖子 2053
威望 0
现金 14275 银币
金币 1 金币
阅读权限 100
注册 2007-3-25
状态 离线
发表于 2007-8-17 11:47  资料  个人空间  短消息  QQ

这肯定需要一个算法,我是不会...问问做红警地图的人

顶部
[广告] 本月CWG有才贴---侦探火狼,孽缘曝光全解析
necrocoder
骑士
Rank: 24Rank: 24Rank: 24


UID 41915
精华 1
积分 1190
帖子 68
威望 2
现金 3173 银币
金币 0 金币
阅读权限 50
注册 2007-8-10
来自 天津
状态 离线
发表于 2007-8-17 14:03  资料  个人空间  短消息  QQ

可能还不能像红警,红警生成的地图是存起来的,要是那样的话,服务器存地图都存满了。所以这个地图除了被玩家破坏的部分以外,应该是可以快速计算出来的。

顶部
[广告] 绿豆蛙四格漫画填字活动
dogvane
勋爵
Rank: 40Rank: 40Rank: 40Rank: 40Rank: 40



UID 22711
精华 6
积分 7292
帖子 144
威望 13
现金 8180 银币
金币 2 金币
阅读权限 60
注册 2007-4-22
状态 离线
发表于 2007-8-17 19:32  资料  个人空间  短消息 

还是不太明白楼主目的,是怎样类型的游戏需要改地图?
类似《暗黑破坏神》的随机地图,还是《帝国时代》的随机地图?

顶部
[广告] 本月CWG有才贴---侦探火狼,孽缘曝光全解析
necrocoder
骑士
Rank: 24Rank: 24Rank: 24


UID 41915
精华 1
积分 1190
帖子 68
威望 2
现金 3173 银币
金币 0 金币
阅读权限 50
注册 2007-8-10
来自 天津
状态 离线
发表于 2007-8-18 22:46  资料  个人空间  短消息  QQ

大概是这样:设想一个跑不到边的场景,几乎可以一直向东跑,一年都碰不到边。路上会遇到暗黑那样的栅栏、树。道路和草地。随机产生场景很容易,但是玩家突然又向西跑的时候不能让他看到环境变化很大,而且不是他跑过来时看到的样子。动态传输这样的大地图也不难,但是如果存在算法,就可以不传输或只传输种子,并且保证服务器的判断依据(能不能穿越)和用户看到的一致。

顶部
[广告] 把自己写进最经典的角色扮演游戏中去,这就是同人版魔法门7!
dogvane
勋爵
Rank: 40Rank: 40Rank: 40Rank: 40Rank: 40



UID 22711
精华 6
积分 7292
帖子 144
威望 13
现金 8180 银币
金币 2 金币
阅读权限 60
注册 2007-4-22
状态 离线
发表于 2007-8-19 09:38  资料  个人空间  短消息 

楼主应该听过算法与数据结构里面的疏矩阵,通过它来保存一些关键信息,如果道路,栅栏,村庄等信息。
客户端在显示的时候,再以关键信息为地图的Key,计算出当前地图的内容。
例如道路两旁必须是平地,然后再是灌木丛,以及大树。

顶部
[广告] 绿豆蛙四格漫画填字活动
necrocoder
骑士
Rank: 24Rank: 24Rank: 24


UID 41915
精华 1
积分 1190
帖子 68
威望 2
现金 3173 银币
金币 0 金币
阅读权限 50
注册 2007-8-10
来自 天津
状态 离线
发表于 2007-8-19 11:16  资料  个人空间  短消息  QQ



QUOTE:
原帖由 dogvane 于 2007-8-19 09:38 发表
楼主应该听过算法与数据结构里面的疏矩阵,通过它来保存一些关键信息,如果道路,栅栏,村庄等信息。
客户端在显示的时候,再以关键信息为地图的Key,计算出当前地图的内容。
例如道路两旁必须是平地,然后再 ...

稀疏矩阵基本不可用,试想一个10000000x10000000的地图,会有多少房子呢?如果玩家跑100格左右就遇到一个房子的话,这样的房子大概应该有100亿个左右,恐怕不能存下来。
假定这100亿个房子的问题已经解决了(树木之类的可能更多),那么房子之间是否有道路连接?这至少是个二元关系,所以数据量也在100亿的平方那个数量级,即使很稀疏,达到数十亿分之一,或者干脆限制一下,只有临近的房子之间才可能有道路,那样的连接数量也在100亿的线性数量级,以亿分之一的几率布置道路,大概还有几百个呢。


玩家跑100格大概相当于跨过几个屏幕了,只见到一个像样的房子之类的东西,而且几乎找不到相连的道路,恐怕不会开心的。那样的地图看起来像沙漠。

顶部
[广告] 论坛红包功能恢复,准骑士以上可评分。结婚系统安装完毕,大家可以开始表白了
necrocoder
骑士
Rank: 24Rank: 24Rank: 24


UID 41915
精华 1
积分 1190
帖子 68
威望 2
现金 3173 银币
金币 0 金币
阅读权限 50
注册 2007-8-10
来自 天津
状态 离线
发表于 2007-8-19 11:28  资料  个人空间  短消息  QQ

我的想法基本是这样,做一个和坐标相关的函数:
f(x,y,s) = .....
其中,(x,y)是地图上的逻辑坐标,s是一个自然数。
任意一个这样的函数都会在地图的某点(x0,y0)产生一个数列:f(x0,y0,1),f(x0,y0,2),...,f(x0,y0,n)
这个数列可能具有某些特性,比如:
1、在平面的取值接近随机数,则可以用来控制纹理(比如草地设计了5种纹理,则用f(x,y,1)就可以实现随机的纹理)
2、在平面的取值(或某个分量)表现为大的无规则区块,则可以用来控制地貌特征(比如有碎石地面和草地,用f(x,y,1)就可以分清哪些地方是草,哪些地方是碎石)
3、在平面的取值(等高)表现为聚集的孤岛或散落的点,则可以用来控制植被之类的地貌衍生物(如碎石上的突起石块和草地上的花儿、甚至可以模拟稀树草原上零星的树木)

道路的问题暂时还没什么想法

顶部
[广告] 论坛投票锁帖系统(主题帖投票)启用,会员可以控制帖子的关闭与否
fieldwind
版主
Rank: 68Rank: 68Rank: 68Rank: 68Rank: 68


UID 34106
精华 3
积分 9790
帖子 1014
威望 10
现金 8329 银币
金币 0 金币
阅读权限 120
注册 2007-6-28
状态 离线
发表于 2007-8-19 14:53  资料  个人空间  短消息 

这个算法比较难,你要求地图合理还要求玩家经过后再返回无差别,并且又不希望储存,难度太大,除非客户端电脑拥有记忆功能





才出风尘又沾尘,
冷月无痕复留恨。
方见浮云消无影,
独余风逝花弄人。
顶部
[广告] 论坛红包功能恢复,准骑士以上可评分。结婚系统安装完毕,大家可以开始表白了
necrocoder
骑士
Rank: 24Rank: 24Rank: 24


UID 41915
精华 1
积分 1190
帖子 68
威望 2
现金 3173 银币
金币 0 金币
阅读权限 50
注册 2007-8-10
来自 天津
状态 离线
发表于 2007-8-19 16:41  资料  个人空间  短消息  QQ

只要生成的“自然”合理,就不用记忆了

顶部
[广告] 本月CWG有才贴---侦探火狼,孽缘曝光全解析
cosin
准骑士
Rank: 18Rank: 18Rank: 18Rank: 18



UID 23179
精华 0
积分 526
帖子 18
威望 0
现金 2944 银币
金币 0 金币
阅读权限 40
注册 2007-4-26
状态 离线
发表于 2007-8-20 13:39  资料  个人空间  短消息 

按楼主说的 10000000 * 10000000 的地图格子
屏幕宽 1024 , Tile 大小 32*32
那么一屏幕是 32 个Tile,假设移动速度为 4 Tile/sec(这个速度已经不慢了)
10000000 / 4 = 2500000 sec ,大概是 28.9 天
不清楚楼主做什么类型的游戏,需要玩家连续1个月执着的向着一个方向前进。。。

PS:这个贴精华在哪里?胡思乱想么?

顶部
[广告] 把自己写进最经典的角色扮演游戏中去,这就是同人版魔法门7!
necrocoder
骑士
Rank: 24Rank: 24Rank: 24


UID 41915
精华 1
积分 1190
帖子 68
威望 2
现金 3173 银币
金币 0 金币
阅读权限 50
注册 2007-8-10
来自 天津
状态 离线
发表于 2007-8-20 13:47  资料  个人空间  短消息  QQ

这个贴的意图在于探讨算法,至于玩家向哪里跑与本题无关

顶部
[广告] 本月CWG有才贴---侦探火狼,孽缘曝光全解析
necrocoder
骑士
Rank: 24Rank: 24Rank: 24


UID 41915
精华 1
积分 1190
帖子 68
威望 2
现金 3173 银币
金币 0 金币
阅读权限 50
注册 2007-8-10
来自 天津
状态 离线
发表于 2007-8-20 13:51  资料  个人空间  短消息  QQ



QUOTE:
原帖由 cosin 于 2007-8-20 13:39 发表
按楼主说的 10000000 * 10000000 的地图格子
屏幕宽 1024 , Tile 大小 32*32
那么一屏幕是 32 个Tile,假设移动速度为 4 Tile/sec(这个速度已经不慢了)
10000000 / 4 = 2500000 sec ,大概是 28.9 天
不 ...

数据计算是没问题的,不过可以看出,10000000的地图还是不够玩家跑一年的。而且,即使扩大Tile的尺寸,让它足够跑一年,这样的地图存在哪里都会很占地方的,所以讨论一个生成算法很有必要。

顶部
[广告] 把自己写进最经典的角色扮演游戏中去,这就是同人版魔法门7!
cosin
准骑士
Rank: 18Rank: 18Rank: 18Rank: 18



UID 23179
精华 0
积分 526
帖子 18
威望 0
现金 2944 银币
金币 0 金币
阅读权限 40
注册 2007-4-26
状态 离线
发表于 2007-8-20 13:51  资料  个人空间  短消息 

地图可以参考这个,做点改变就可以达到。。。
http://www.codingnow.com/isomtric/map.htm

顶部
[广告] 绿豆蛙四格漫画填字活动
necrocoder
骑士
Rank: 24Rank: 24Rank: 24


UID 41915
精华 1
积分 1190
帖子 68
威望 2
现金 3173 银币
金币 0 金币
阅读权限 50
注册 2007-8-10
来自 天津
状态 离线
发表于 2007-8-20 13:54  资料  个人空间  短消息  QQ



QUOTE:
原帖由 cosin 于 2007-8-20 13:51 发表
地图可以参考这个,做点改变就可以达到。。。
http://www.codingnow.com/isomtric/map.htm

这个算法很早就有,但它是用来管理“显存”的,也就是说,只能处理地图过大和显存很小之间的矛盾,并不是本贴讨论的内容。

顶部
[广告] 论坛红包功能恢复,准骑士以上可评分。结婚系统安装完毕,大家可以开始表白了
 



当前时区 GMT+8, 现在时间是 2008-9-8 19:57
沪ICP备06036464号

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.5.0 Licensed  © 2001-2007 Comsenz Inc.
Processed in 0.113183 second(s), 10 queries , Gzip enabled

清除 Cookies - 联系我们 - Chinese Webgame BBS 中国网页游戏论坛 - Archiver - WAP