深入分析游戏中的物品系统

来源:互联网 发布:淘宝在哪搜索店铺名称 编辑:程序博客网 时间:2024/06/10 01:26

深入分析物品系统

 

 

  撰写本文是一边完成实现,一边整理思路时做的。所以文档结构并不是按思想上的一贯循序渐进原则在进行,该文档是按程序和主模块结构在阐述。

 

  我们先形象看一下物品。物品从游戏整体来看是以流的形式在运行。假如,物品掉落到场景中,那么物品就流入场景了。而物品被角色检起来,放进背包,这时候物品就流入角色的背包了。然后,物品如果被装备到角色的身体,这时候物品就流入角色的身上了。

 

  以上述的物品流为例,来分析一下程序的实现。

 

从物品掉落到场景到物品被角色检起来

       运行机制上是物品在掉落到场景中以前,物品已经创建好了。物品中的关键数据,比如物品类型,物品的Portrait,物品的价格,等等,这些数据必须在之前就被创建好。然后物品在掉落时,可以是从箱子,桶,或则从死亡的角色身体上掉落。物品的掉落形式,是用Plane和屏蔽深度缓冲掉落的。值得说明的是,当物品掉落到场景时,物品在内部会触发一个事件,告诉规则系统,这时物品已经掉落到场景了。这时,物品在被角色检起来之前,物品会一直存在于场景中。而当物品被角色检起来时,在物品内部也会触发一个事件给规则系统,告诉规则系统,这时物品已经被某角色检起来了。

 

从物品被检起来再到角色的身体,然后再到场景

       当角色将物品检起以后。这时该物品就存在于一个角色的背包中了。你可以将背包理解成一个容器,但是我不建议你用游戏中那种形象的背包表示来理解容器,因为这个容器在这时是抽象的,只有在经过了GUI的表示以后,然后才会以形象的方式呈现出来。我们也是通过这种GUI来将物品装备到角色身上的。

       当物品从背包到被装备到角色身上,机理是和场景掉落同样的。都会触发一个事件给规则系统,告诉规则系统当前物品的流向,所处。而物品在功能和程序的实现上,也是在该事件中搞定的。

 

在了解了物品流向以后,我们来分析一下物品的使用。

       物品在使用上,建议你读一下那篇深入分析规则引擎。

       物品在使用上,主要是使用技能系统得运行机制。各种不同物品,有各种不同的使用方式。火球术法仗可以向一个区域发出面积性杀伤的火球术,飞弹法仗是向一个角色发射魔法飞弹,而药剂则是直接使用,不需要鼠标额外的点击。其实在物品使用上,是和技能一样的,分为,直接使用,必须指定另一个角色为目标来使用,或则必须指定某一个区域为目标来使用,等等,等等。建议去读一下那篇深入分析规则引擎,这篇文章对技能系统的实现分析是非常深入的。物品在使用的机制上则是完全的借鉴技能系统。

 

数模的架构:

数模在架构上,我采用队列分批计算。

举个例子,角色生命这个数模,是一个触发器的集合容器。角色当生命受到影响时,该数模会依次触发计算触发器集合容器中的那一大堆接口过的事件。

在生命数模中,有两个关键数值。生命数模的母模,和生命数模的变化模。母模的作用是,如果用Designer的传统思想来说,母模是存在于数据库中的数模。而变化数模,则是随游戏进行不断变化的数模。这两个数模都有各自得触发器集合容器,当数模发生变化,就会触发那些注册事件。

那么,数模系统是怎样工作的呢?

数模系统,是依靠母模来工作的,而数模的改变,是在触发事件中,拿程序来计算。当母模改变时,就全部刷新这些触发事件。而当数模的触发器容器,被增加或则减少事件时候,这些专用计算数模的触发事件,也会被全部刷新。这样就可以实现那种,当装备到角色身上时,角色数模受到影响,当装备被卸下时,角色数模的数值被还原。

 

 

物品的系统构架:

       物品的系统构架,详细来描述的话,是物品的数据构架到数据构架的驱动程序,它们之间的构架。

       物品的数据:物品的数据,前面大致说了一下。从总体来说分为,图片+配置数据。配置数据的内容,有很多属性,比如可以被交易,可以装备到身上(装备),只能饮用(药水)。

 

物品数据构架的驱动方式:

调用物品驱动时,配置数据作为参数传递给物品驱动程序。物品驱动程序从参数中,取得物品的相关属性,然后再有根据的运行。我举个例子,

假设有一个StandItemDriver函数。我们这样写即可。

StandInstItemDriver(“国王盔甲.ini”,角色A);

我的实现是放在核心系统的脚本中完成的。StandInstItemDriver,是一个专用的驱动可以装备物品的驱动程序,以函数的形式来使用。国王盔甲的说明信息,命名,和对于属性的影响,等等相关的配置信息,都存在于“国王盔甲.INI”这个文本文件中。具体的配置信息是根据物品驱动程序在处理。

如果这样写则不对,违反了制作上的思想

StandInstItemDriver(“生命回复药水.ini”,角色A);

 

 

物品的使用方式:

       物品在使用上,我是用的技能在代替物品的用途。比如一瓶毒药,可以向别人投掷过去,也可以通过自己饮用来伤害自己。如果向别人投掷过去,这时候就是使用技能库中的一个投掷技能来完成,这点是和技能的使用机制是一致的。如果是自己饮用,也是使用技能库中的一个技能来完成。像消耗品,生命药剂,魔法药剂,等等,在使用上都是采用这样的工作机制。总之,物品在使用上,都是使用的技能系统得工作机制在实现。

 

开发可装备的物品和数模构架:

       可装备的物品前面大致提了一下。可装备物品在驱动上主要是先获得物品的所属环境的事件,然后接获,然后在该事件中通过判断所属环境,来决定物品对于角色数模的影响。这整个的过程,都是在同一个物品的驱动中完成的,比如国王盔甲这个物品,对于数模的影响,就是在StandInstItemDriver中完成的。

       下面我来详细介绍一下驱动的具体结构和开发方式。

       因为我的核心规则是用Pascal脚本在实现,所以这里我暂时以Pascal为例。

 

       Unit StandInstItemDriver

 

       Procedure OwnerChange(_OwnerID:Integer; _Obj:TObject);

       Begin

              Case _OwnerID of

                     场景:;

                     背包:;

                     身体:

                            Begin

                                   角色(_Obj).数模.A:= 角色(_Obj).数模.A+50;

                                   角色(_Obj).数模.B:= 角色(_Obj).数模.B+50;

                                   角色(_Obj).数模.C:= 角色(_Obj).数模.C+50;

                            End;

              End;

End;

 

       Begin

              TriggerTarget.OwnerChangeEvent:= OwnerChange;

              //读入数模

              IniFile.LoadFromFile(TriggerSource);

              //

              EnabledResident;

       End.

 

该脚本只是提供实现思路的构架。并非是实际环境中的物品驱动脚本。

在实际环境中的驱动是非常复杂的,涉及到很多数模的计算,和很多数模的触发器程序。

 

在物品驱动中,结合数模:

       在物品驱动中要结合数模。先要在物品驱动被启动时,注册一些数模的触发器。

       这样才能从真正的意义上实现那些属性数模的数值灵活化。

       因为我用文档来表达程序,尤其是像物品驱动结合数模这种程序,这种程序是架构比较复杂,实现起来并不复杂,可能几百行代码就可以将整体思路表达出来。

       介于篇幅的关系,我就不多做介绍了。

 

 

  如果你对数模,物品驱动,核心规则构架,感兴趣,可以向我索取一份TrueLife(真动力)引擎的核心规则的代码。从科学角度,凡是有兴趣的,我都可以无条件的倾囊相赠。

 

2007-3-21

By.

原创粉丝点击