代码与游戏对象库的配置

mik*_*era 3 language-agnostic design-patterns data-structures

我正在开发一款小型在线游戏,需要存储大量(100多种)不同类型游戏对象的大量信息.

我正在尝试决定是否通过代码生成此数据或存储在某些配置文件中.

数据生成方法类似于(在java-ish伪代码中):

(within a set of functions executed once at program startup)
....
// create grass terrain
grass=new GameObject();
grass.inheritProperties(generic_terrain);
grass.set(NAME,grass);
grass.set(MOVEABLE,true);
grass.set(MOVECOST,10);
grass.set(IMAGE_INDEX,1);
....
Run Code Online (Sandbox Code Playgroud)

而配置文件方法可能只使用XML类型格式,例如

(within terrain.xml file)
....
<terrain name="grass">
    <inherit class="generic_terrain"/>
    <property key="NAME" value="grass"/>
    <property key="MOVABLE" value="true"/>
    <property key="MOVECOST" value="10"/>
    <property key="IMAGE_INDEX" value="1"/>
</terrain>
....
Run Code Online (Sandbox Code Playgroud)

一些要点:

  • 每次游戏运行时该信息都是静态的(即在执行期间不会改变)
  • 属性名称(NAME,MOVECOST等)是一个相对较小的列表,但随着时间的推移可以添加其他名称
  • 可以安全地假设它只会被开发团队更改(即,不需要在构建过程之外管理配置).
  • 由于游戏平衡的原因,需要在开发期间定期进行调整(例如,使单位更少/更强大)
  • 存在一定量的属性"继承",即在上面的示例中,grass需要具有generic_terrain定义的所有标准属性以及一些新的添加/更改.

哪种方法最适合这种情况?更重要的是为什么?

Nic*_*unt 5

就个人而言,我喜欢尽可能多地进行配置.这样做的原因是,在某些时候我可能想要以完全不同的方式重用我为游戏编写的代码.如果源代码中充斥着对实现特定细节的引用,那么这将变得更加困难.

当你想要开始描述对象的行为以及它们的值时,会出现一个有趣的配置方法.考虑一个简单的例子,你有一个需要"捕捉"球对象的杯子对象.你可以表达它们:

<object name="ball">
    <property key="shape" value="circle"/>
    <property key="movable" value="true"/>
    <property key="speed" value="10"/>
</object>

<object name="cup">
    <property key="shape" value="rectangle"/>
    <property key="movable" value="true"/>
    <property key="speed" value="6"/>
    <property key="catches" value="ball"/>
</object>
Run Code Online (Sandbox Code Playgroud)

这里的问题是,你仍然需要在代码中定义"捕获"的内容.如果您使用的是解释性语言,则可以执行以下操作:

<object name="cup">
    <property key="shape" value="rectangle"/>
    <property key="movable" value="true"/>
    <property key="speed" value="6"/>

    <oncollision>
      if (collided.getName() == "ball") {
        collided.destroy();
        points++;
      }
    </oncollision>
</object>
Run Code Online (Sandbox Code Playgroud)

现在你已获得描述一个物体的能力表现,以及它是什么.这里唯一的问题是,如果您不使用解释语言,则无法在运行时定义代码.这是Lua在游戏开发中如此受欢迎的原因之一.它既可以作为声明语言也可以作为程序语言使用,并且很容易嵌入到已编译的应用程序中.所以你可以表达这样的情况:

object {
  name='ball';
  movable=true;
  speed=10;
}

object {
  name='cup';
  movable=true;
  speed=6;
  oncollision=function(collided)      
     if collided:getName() == "ball" then
        collided:destroy();
        points++;
     end
  end;
}
Run Code Online (Sandbox Code Playgroud)