29

有谁知道我在哪里可以找到 RP 游戏开发的类图示例?类似于这里的东西会非常有用。我不是在寻找我可以盲目复制的东西,而只是寻找不同的例子,这些例子描绘了我在尝试写下我自己的课程时发现的问题的各种解决方案。

4

7 回答 7

51

我从 GameDev.net 认识 Emmanuel Deloget,但我不确定我会选择使用他那里的层次结构!继承太多,灵活性不够。

如果我正在编写一个基于文本的 RPG(就像我过去所做的那样),它看起来有点像这样(虽然我没有时间为其绘制图表,遗憾的是):

  • 从 WorldEntity 派生的 Creatures、Rooms 和 Items,WorldEntity 对象排列在一个复合结构中,因此项目可以存在于其他项目中,由存在于房间中的生物携带。为 WorldEntities 实现访问者模式可能效果很好。
  • CreatureType 和 ItemType 类,其中包含各个 Creature 和 Item 实例的“类”数据,它们引用它们相应的“类型”对象。(例如,前者的基础生命值和统计数据,后者的当前生命值和瞬态效果)。我可能会将这些作为原型属性列表来实现,这些属性列表在创建时会被复制到 Creature 或 Item 实例中。您可以通过“父”属性实现属性继承,以便特定地精 Creature 实例可能与“战士地精”CreatureType 相关,其中包含对“通用地精”CreatureType 的父引用。等等。
  • 属于他们房间的出口,是一种方式,详细说明了行进方向、各种通行条件等。
  • 包含通过某种逻辑组织连接的房间组的区域。
  • 一个 Spawn 类,用于指示创建 Creature 和 Item 实例的位置(例如,哪个房间,或在什么坐标),创建它们的时间和频率,以及来自哪些 CreatureTypes 和 ItemTypes。你可能在这里有一些逻辑来随机化一些事情。
  • 咒语、技能、能力等都派生自指定先决条件(例如当前位置、法力值、某种技能学习程度等)的基本动作类或接口。正常的命令和动作也可以放在这里,因为它们通常也有某种要求(例如,“睡眠”命令要求你还没有睡觉。)
  • 一个 FutureEvent 类,它本质上是一个回调,您将其推送到优先级队列中以在将来执行。您可以使用这些来安排战斗回合、法术冷却时间、夜间/白天循环,无论您喜欢什么。
  • 用于玩家和物品统计的名称->值对的哈希/地图/字典。不是类型安全的,但您稍后会欣赏这种灵活性。根据我的经验,使 stats 成员变量可行但不灵活,并且在调试时拥有专门的“属性”类成为一个令人费解的噩梦。
  • 包含属性名称和修饰符值的修饰符类型(例如 +10、+15%)。这些会在使用时添加到您的生物中(例如,通过法术效果,或通过使用附魔武器),稍后会被定时的 FutureEvent 或其他一些事件(例如正在执行的命令)剥离。
  • 特定于游戏的类,例如 PlayerClass 或 PlayerRace,每个类都描述玩家的类(例如战士、巫师、小偷)或种族(人类、精灵、矮人),并设置起始统计值和限制、技能可用性列表、特殊能力、等等
  • 基本的播放器界面类,将根据您的实际游戏类型而有所不同。你可能有一个图形游戏的渲染类,或者在一个 MUD 中你可能有一个 Connection 类来反映与玩家客户端的 TCP 连接。尝试将所有游戏逻辑排除在这些之外。
  • 一个脚本接口。您的大多数命令、咒语和生物 AI 都可以通过体面的脚本界面更快地实现,并且还可以缩短编译时间。它还允许一些出色的游戏内调试和诊断功能。

那将是我将使用的基本高级结构。

于 2009-08-04T14:37:40.963 回答
11

您可能需要考虑组件实体系统而不是传统的继承层次结构;它们往往对某些类型的更改更加灵活,使工具(例如世界编辑器)的开发更加容易,并提供了并行化的机会,这些机会在其他情况下可能并不明显或容易。

许多现代游戏引擎正在从“单片类对象”(或类实体,等等)转向“组件包”方法。

周围有很多书籍和文章。一般来说:

具体来说(一些值得注意的,谷歌“组件”和“实体”的各种组合更多):

这些文章中的每一篇都链接到更多。

试试kool-aid,你可能会喜欢。=)

于 2009-08-06T02:29:33.623 回答
5
<tongue_in_cheek_mode_because_it_is_friday>

刚开始:

          ----------------                    --------------
          |   Creature   |                    |  Item      |
          |--------------|                    |------------|
          | Name         |                    | Name       |
          | Hp           |                    | Value      |
          | Abilities    |--------------------| Weight     |
          |--------------|                    --------------
          | Attack       |
          ----------------
                 ^
                 |
        ----------------------
        |                    |
----------------    ----------------
|  Hero        |    |  Monster     |
|--------------|    |--------------|
| Level        |    |              |
|--------------|    |--------------|
| KillMonster  |    | AttackAndDie |
| GrabTreasure |    | DropTreasure |
----------------    ----------------

</tongue_in_cheek_mode_because_it_is_friday>
于 2009-07-31T12:10:53.753 回答
4

Steve Yegge的一个非常不同的方法

于 2009-08-06T13:15:27.443 回答
3

查看JADE 的 Javadoc以获得对复杂游戏的一个很好的概述 :)

于 2009-08-03T16:34:22.153 回答
1

大胆一点,你的游戏不应该是胡说八道的克隆。你的演员应该可以换边,主动拉拢其他演员等等。否则,有什么意义?

   +-----------------------------+
   V                             |
[Actor] ------- [Allegiance] ----+
 - risk comfort    - weight
 - temerity        
于 2009-08-07T02:19:47.297 回答