【问题标题】:Code vs. configuration for game object library游戏对象库的代码与配置
【发布时间】:2010-06-23 18:18:22
【问题描述】:

我正在开发一款小型在线游戏,其中需要存储有关许多(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);
....

而配置文件方法可能只使用 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>
....

一些要点:

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

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

【问题讨论】:

  • 如果您正在寻找一种高效的配置文件格式,我建议您查看yaml :)

标签: language-agnostic design-patterns data-structures


【解决方案1】:

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

当您想要开始描述对象的行为以及它们的值时,会出现一个关于配置方法的有趣警告。考虑一个简单的例子,你有一个杯子对象需要“捕捉”球对象。你可以这样表达:

<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>

这里的问题是,您仍然必须在某个地方定义“捕获”在代码中的作用。如果您使用的是解释性语言,您可以执行以下操作:

<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>

现在您已经能够描述一个对象的行为以及它是什么。这里唯一的问题是,如果您不是使用解释型语言工作,您就没有在运行时定义代码的奢侈。这也是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;
}

【讨论】:

    【解决方案2】:

    从代码中分离数据总是一个好主意。即使数据在执行期间是静态的,它也不是在设计过程中。具有硬编码数据的游戏远不如从易于修改的配置文件中收集数据的游戏灵活。

    将数据保存在单独的文件中,例如 xml,可以快速简单地更改各种值,您说这很重要。

    【讨论】:

    • 配置文件可以是单独的文件,即使它只是代码。
    【解决方案3】:

    这与语言无关。

    如果您使用的是编译语言,请使用配置文件,这样您就不会在每次调整某些内容时都强制重新编译。

    如果您使用的语言不需要执行显式编译/链接过程,请在代码中执行,这样您就不必处理解析和加载。 (但是在一个地方进行,以便您可以轻松地完全更换功能,如果您将来需要这样做)。

    这里的基本理念是代码就是数据,但有时代码即数据很难修改;在这种情况下(例如,编译语言的情况),用一种更容易修改的代码来编写它。 (您的解释配置语言。)

    【讨论】:

    • 有趣...虽然我个人从未受到这种情况下重新编译成本的影响 - 如果编译+运行所有测试需要三秒钟(或者更好的是在后台自动运行)然后它可能不会比导航到/从单独的配置文件花费更多。
    • 如果您有幸使用动态加载的库,我想可能就是这种情况。编译/链接我正在使用的系统,仅更改一个 .cpp 文件,大约需要 45 秒。所以 YMMV 在这个上。
    【解决方案4】:

    出于您提到的许多原因,许多游戏引擎都使用脚本语言。 Lua 是一个非常棒的、相当快的、轻量级的脚本引擎,已经在很多游戏中取得了巨大的成功。您可以轻松地使用解析器进行简单的配置设置并保留它,或者构建更多功能并将实际代码写入文件中。您在 lua 中的示例可能类似于:

    grass = {
        NAME = "grass",
        MOVEABLE = true,
        MOVECOST = 10,
        IMAGE_INDEX = 1
    }
    
    setmetatable(grass, generic_terrain)
    

    【讨论】:

    • 所以,如果我理解正确,Lua 属于“代码”阵营,但它使用轻量级的特定领域语言并动态运行,使其行为更像配置文件?
    • 如果你想这样设置它可以表现得像一个简单的配置文件。 Lua 的基本数据结构是一个表(它是哈希表和数组的组合),这使得它在配置语言中工作得相当好。
    【解决方案5】:

    如果您确实选择使用 XML,请至少尝试使用合理的模式。当设计为直接表示这些东西时,没有理由将您自己的小模式(“对象”、“属性”、“键”、“值”)嵌入到 XML 中。怎么样:

    <ball>
        <shape>circle</shape>
        <movable>true</movable>
        <speed>10</speed>
    </ball>
    
    <cup>
        <shape>rectangle</shape>
        <movable>true</movable>
        <speed>6</speed>
        <catches>ball</catches/>
    </cup>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多