.GAME FRAMEWORK

开始用.NET构建我们梦想中的游戏

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

目前为止,我的思绪还是挺凌乱的,不象steeven那样,已经考虑清楚了,说起来一条一条的。我所想象的框架非常的大,自己也不知道该用什么顺序说。如果我说得太乱了请见谅!

在这个框架里面,我想首先着重提出两个概念:1、场(Field);2、环境(Environment)。以及因此牵扯到的一个很普通的概念:地图(Map)

首先说说“场”。所谓的场是指类似“重力场”、“磁场”等等地球物理规则,当然,物理上所说的场一般都和“力”有关系,同时是看不见摸不着、远距离产生影响的抽象环境。而我这里所说的场,仅仅体现一个物理环境的概念,里面可能包含一些(简化的、抽象的)物理规则。比如说:

重力场——用于制约地图上的对象位置,如果无法产生一个向上的力,就会最终掉下来。
海平面场——用于描述整个海平面高度的情况,必要的时候可以获取在“地面”移动所必须消耗的能量。
可见光场——用于描述我们普通情况下所看到的图形情况。
红外场——用于描述地图上面的热量情况,所有物体都会散发或多或少的热量。
化学场——用于描述地图上面化学物质的分布情况,可以通过遗留化学气味来释放信息,通过“闻”来获得信息。甚至化学场可以和“物质”结合起来。(这个在以后的Post进行描述)
声场——用于描述声音的情况。可以通过说话、吼叫来传达信息,同时移动也会泄露信息。
等等

上面这么多的场并不都是必须的,一个游戏可能只会使用其中的一个或者两个场,但是都用也是可能的,例如我所考虑要复现的Terrarium就需要所有的这些场。那么这些场怎么描述呢?肯定是一个简化的形式,例如化学场,会用一个int来表示某一种化学物质,另一个int表示该化学物质的强度。同一个地点可以有多个物质,也可能是同一个地点只能有一个物质但是附近有别的物质,这两种形式我还没有考虑清楚,但是有一点是确定的,那就是应该让“游戏对象”认为“这里”有好几种“化学物质”。
再比如说声音,一个int表示频率,另外一个int表示强度。我想这个就足够传递众多的信息了。

有人会说了,那个可见光场还有重力场,不应该是地图做的事情吗?对,很多时候都应该是地图的事情,甚至化学场也是地图的事情,比如星际上面的矿和油,不就可以算是化学场吗?但是,我们要考虑的是一个通用的框架,所以必须要把这个概念从地图上面剥离出来。不然的话这个Map对象就很难定义,或者定义出来的Map对象适应性非常的差!比如说我们考虑:1、星际;2、QuakeII。那么星际也许需要化学场,不需要重力场,但是QuakeII没有重力场肯定不行,但是化学场有什么作用呢?

当然,我这个考虑也不是很成熟,因为这么多的场,很可能会占用非常多的资源,包括CPU使用率和内存占用情况。但是这个概念我还是得提出来,至于具体怎么个设计,使得占用资源的情况可以接受,那就是另外一回事了。

第二个要提出来的是“环境”。所谓的环境就是指一些“世界”常量,相当于系数,这些系数影响着整个“游戏世界”的物理规律,或者守恒情况。也许大家会说:系数那还不好办吗?随便找一个地方定义一个public static的东西就行了,何必搞出一个概念出来进行开发呢?让我描述下面这几个问题:
1、首先,随便找一个地方有一个很大的缺点,就是游戏开发者不知道到哪里去设置和调整这些系数,或者需要到处去找。重力相关的要到重力那里去找,化学相关的要到化学那里去找……找着找着就烦了,找不到那就更烦了。
2、其次,有一个问题不知道大家考虑过没有?有些系数可能会影响另外一些系数的情况,为了正确调整某个系数的值,开发者不得不调整一系列的值,这个问题时不得不正视的问题。举个例子:
标准海平面重力加速度数值:g
海平面重力加速度调整系数:gFix
地球半径数值:rEarth
标准单位重量移动消耗能量数值:burn
单位重量移动消耗能量调整系数:burnFix

那么某个质量是m的对象在某个海平面高度h移动所需要消耗的能量的计算公式也许如下:(肯定不对,只是示意一下)
needToBurn = m * (gFix * g * rEarth/h) * (burn * burnFix) = gFix * g * rEarth * burn * burnFix * m / h
大家可以看到最后等式里面前面一大串的数值都应该属于世界常量,为了加快这个公式的计算,就应该有一个“海平面单位重量移动消耗能量值 burnSeaLevel = gFix * g * rEarth * burn * burnFix”,如此一来计算needToBurn就可以减少四次乘法计算(毕竟修改世界常量的频率肯定非常低)。那么问题就出来了,如果提供一个控制台命令,修改gFix,那么这个命令就很麻烦了,除了需要修改gFix之外,还需要修改burnSeaLevel,以及其他这里没有提到的blablabla。

如果有一个“环境”,我们只需要定义好一些常量,以及一些“伪常量”的计算公式。那么当修改某个常量的时候,“环境”就会帮助我们自动更新那些“伪常量”,开发者只需要定义一次,修改一次(而不是多次)。是否很方便呢?

最后,我来说一下地图。由于有一些概念从地图里面剥离出来了,所以有必要说一下地图上面有什么。地图上面包括这个地图的大小的定义,以及传统意义上的“地图”。也就是是这个地图上面有些什么对象,这个对象包括人物啦,物品啦,建筑啦,还有陷阱(机关)——用于触发某些事件。

这次就说到这里,下次继续。下次可能会说到“规律”以及/或者其他的一些东西。

posted on 2004-05-16 08:22  我们的游戏世界  阅读(1754)  评论(7编辑  收藏  举报