【问题标题】:How to use XML for an RPG Stat/Leveling system如何将 XML 用于 RPG Stat/Leveling 系统
【发布时间】:2017-06-27 15:56:10
【问题描述】:

我正在考虑开发一个 RPG 引擎,主要是为了开发经验,而不是真正针对任何商业。然而,在存储类基本统计数据时,我遇到了一些困难。多年来,我在 Game Maker 中工作得更广泛,所以我的经验更适合于此。我目前正在使用 Monogame 使用 C# 并围绕它展开工作。

我相信存储我需要的信息的好方法将需要外部文件,来自我所阅读的内容。我习惯于调用和使用来自 GM 的 INI 文件,但我没有那么多能力将我的头脑围绕在 XML 上。我有一个我希望实现的设置的公共粘贴箱,并且很好奇你们的想法,如果这样的设置是可行的,或者我是否正试图以某种糟糕的方式做到这一点。

我正在设计的 XML 文档(完全按照理论)的结构如下:

<?xml version="1.0" encoding="utf-8" ?>
<BaseClass>
  <Class Class="Barbarian">
    <Level Level="1">
      <baseAtk>1</baseAtk>
      <baseFort>2</baseFort>
      <baseRef>0</baseRef>
      <baseWill>0</baseWill>
      <classSkillCt>2</classSkillCt>
      <classSkill0>ID_CS_BARB_FASTMOVE</classSkill0>
      <classSkill1>ID_CS_BARB_RAGE</classSkill1>
    </Level>
    <Level Level="2">
      <baseAtk>2</baseAtk>
      <baseFort>3</baseFort>
      <baseRef>0</baseRef>
      <baseWill>0</baseWill>
      <classSkillCt>2</classSkillCt>
      <classSkill0>ID_CS_BARB_UNCDODGE</classSkill0>
      <classSkill1>ID_CS_BARB_RAGEPWR1</classSkill1>
    </Level>
    <Level Level="3">
      <baseAtk>3</baseAtk>
      <baseFort>3</baseFort>
      <baseRef>1</baseRef>
      <baseWill>1</baseWill>
      <classSkillCt>1</classSkillCt>
      <classSkill0>ID_CS_BARB_TRAPSENSE1</classSkill0>
    </Level>
    <Level Level="4">
      <baseAtk>4</baseAtk>
      <baseFort>4</baseFort>
      <baseRef>1</baseRef>
      <baseWill>1</baseWill>
      <classSkillCt>1</classSkillCt>
      <classSkill0>ID_CS_BARB_RAGEPWR2</classSkill0>
    </Level>
    <Level Level="5">
      <baseAtk>5</baseAtk>
      <baseFort>4</baseFort>
      <baseRef>1</baseRef>
      <baseWill>1</baseWill>
      <classSkillCt>1</classSkillCt>
      <classSkill0>ID_CS_BARB_IMPUNCDODGE</classSkill0>
    </Level>
  </Class>
  <Class Class="Bard">
    <Level Level="1">
      <baseAtk>2</baseAtk>
      <baseFort>1</baseFort>
      <baseRef>3</baseRef>
      <baseWill>3</baseWill>
      <spellDay0>4</spellDay0>
      <spellDay1>1</spellDay1>
      <spellDay2>0</spellDay2>
      <spellDay3>0</spellDay3>
      <spellDay4>0</spellDay4>
      <spellDay5>0</spellDay5>
      <spellDay6>0</spellDay6>
      <spellDay7>0</spellDay7>
      <spellDay8>0</spellDay8>
      <spellDay9>0</spellDay9>
      <spellKnw0>6</spellKnw0>
      <spellKnw1>4</spellKnw1>
      <spellKnw2>0</spellKnw2>
      <spellKnw3>0</spellKnw3>
      <spellKnw4>0</spellKnw4>
      <spellKnw5>0</spellKnw5>
      <spellKnw6>0</spellKnw6>
      <spellKnw7>0</spellKnw7>
      <spellKnw8>0</spellKnw8>
      <spellKnw9>0</spellKnw9>
      <classSkillCt>6</classSkillCt>
      <classSkill0>ID_CL_SKILL_BRD_BRDKNOWLEDGE</classSkill0>
      <classSkill1>ID_CL_SKILL_BRD_BRDPERFORM</classSkill1>
      <classSkill2>ID_CL_SKILL_BRD_COUNTERSONG</classSkill2>
      <classSkill3>ID_CL_SKILL_BRD_DISTRACTION</classSkill3>
      <classSkill4>ID_CL_SKILL_BRD_FASCINATE</classSkill4>
      <classSkill5>ID_CL_SKILL_BRD_INSPCOURAGE1</classSkill5>
    </Level>
  </Class>
</BaseClass>

如果这不是 XML 文档的工作方式,请告诉我,这样我就不会在这个问题上搞砸了!我不是在寻找任何人为我编写代码,只是为了获得关于实现我正在寻找的最佳方式的公开建议。我希望能够以某种方式获得我要求的任何级别的任何班级的基本统计数据。因此,如果我要请求 (Barbarian,2) 或类似性质的东西,我会得到 2 级野蛮人的信息 :)

我已尝试在线学习许多教程,但尚未找到真正解释以有意义的方式利用任何外部文件的最佳方法的教程。如果有人对此类信息提出了建议,请告诉我!

【问题讨论】:

  • 您拥有的 XML 文档很好,尽管我可能会使用 baseAtkbaseFort 等的属性。不过,您的要求并不清楚 - 要求关闭的问题- 现场教程等是题外话,你还没有给我们一个具体的问题来帮助你解决。如果您可以使用 LINQ to XML,我会强烈推荐它作为一个不错的 XML API。除此之外,请让您的问题更具体。
  • 我不会使用末尾带有数字的标签名称。我会将数字设为 id 之类的属性,这会使 xml 更易于解析。
  • 感谢您抽出宝贵时间回复! @JonSkeet 抱歉,这个问题太开放了。我或多或少对 XML 的工作原理没有深入了解,并且正在尝试学习一种在 Y 级别存储和提取有关 X 类的数据的方法,因此我不必将所有这些信息硬编码到一个类中:) 因为我还没有很好地掌握如何解析 XML 文档中的任何信息,所以我想确保我对它的理解是正确的,所以我知道我不会无处可去。跨度>
  • @jdweng 感谢您的意见!我不会想到这一点,肯定会更好看!

标签: c# xml monogame


【解决方案1】:

您的 XML 很好,尽管 BaseClass 元素应该是复数并且应该与它的内容元素(“类”)一致,这些元素只是 Class。

例如,为了提取 2 级野蛮人的基本攻击加值,您可以使用“./BaseClass/Class[@Class='Barbarian']/Level[@Level='2'”形式的 XPath 表达式]/baseAtk”。或者,您可以使用 LINQ。

【讨论】:

  • 太棒了!我一定会调查所有这些 :) 非常感谢您的意见!
  • 虽然 XPath 肯定是一种选择,但我个人会使用 LINQ to XML 来避免将一种语言有效地嵌入到另一种语言中 - root.Element("BaseClass").Elements("Class").Where(...) 等。不过个人喜好问题。
  • @JonSkeet - 首先,自从十年前的每日 wtf 以来,我还没有和你说过话!其次,我得出的结论是,由于问题显然是有人在学习 XML,他们也可以使用 XPath 复习一下;)很高兴见到你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多