设计角色扮演游戏中典型角色的类层次结构

时间:2010-01-23 12:04:50

标签: c#

我正在尝试设计一个简单的角色扮演游戏,它具有典型的角色类型,如战斗机,巫师,神职人员,小偷等。我需要建议一个好的方法来设置类层次结构。

我最初的尝试是创建一个类型为“Character”的类,并使“角色”中的战斗机,向导,牧师,派生类型。

但后来我认为创建一个“Character”类然后使用装饰模式会更好。所以说战斗机装饰,精灵装饰等等。

或者有更好的方式吗?

5 个答案:

答案 0 :(得分:7)

我认为你可能会把这辆车放在马前。

您的第一笔业务不应该是“我如何代表一个角色?”应该确定“我想代表什么?”也就是说:一个帮助d20角色创作的工具,Shadowrun,Mongoose Traveler,GURPS角色创作,WH:黑暗异端角色创作; “我自己的酷d20 RPG视频游戏”,一个角色和冒险/派对管理套件的软件出售,等等。 以实现中性术语定义。

在您成功确定要制作的内容后,请创建您想要制作的详细定义。这样做的一种方法是列出所有主要名词和动词(角色,向导,战士,创建,保存,删除,复制......等),并开始理解您需要表达的各种概念之间的关系。然后取每个主要名词并将其分解为其组成部分。 (字符:可以是一个类可以是一个或多个类,有一些设备,有一个力量有生命点,有魔法点 ,具有一些主要和次要属性。)继续此分解,直到您无法使用实现中性术语(例如整数......等)。

然后回顾你的定义和分解,并确定是否有任何明显的矛盾陈述,如果是这样,摆脱矛盾。如果不是,则按描述的层次结构组织数据。在我的例子中,将Character,Class,Equipment和Primary Attribute作为类可能是合适的。

一定要保持所有这些“事实”的组织,并在书面和图表中明确他们的关系。从那里你应该能够开始考虑实现细节,例如类向量,其中向导派生自角色......等。

您可能还想了解其他人如何实现this other SO question的内容,以获取指向实现d20的视频游戏引擎的链接。 (即Baldurs Gate)

答案 1 :(得分:1)

我会使用策略和装饰模式的组合。您的初步建议类似于策略模式方法。

尝试区分字符类型和字符特征。字符类型将类似于战斗机,向导,牧师......以及使用策略模式设计它,这会产生一些层次结构树。

角色特征将是火元素,水元素,黑色力量等元素......

E.g。一个战士角色可能会选择火与水元素作为他的本土血统,如海盗(aarrrr!)或铁匠。如果你按层次结构设计,那么你就注定要失败,因为这会让你的层次结构树大小爆炸。

这种角色特征应该用装饰器模式来实现,因为它是角色概念的正交概念。因此,您基本上会创建一个战斗机角色并包裹一个水元素装饰器来获得一个海盗(aarrrr!)。或者创建一个巫师角色并在他周围包裹一个黑暗魔法装饰者以获得一个黑暗法师。或者:装箱一个巫师角色,并在他周围包裹一个水元素和一个黑暗魔法装饰者,以获得一个沼泽地巫师。

一些思想的食物:

  • 如果您决定拥有所有角色 有魔法能力,然后设计 魔术作为性格特征。

  • 如有必要:整理 某种装饰者 层次结构。你可能会 有一个“元素”(水,火, 地球,风)装饰层次结构和 “魔法类型”(黑色,白色)装饰 层次结构。

玩得开心!

答案 2 :(得分:0)

我将继续您的初始尝试,创建一个Character类,然后通过继承扩展功能。虽然所有角色都会执行相同的操作(使用项目,攻击,使用技能),但结果会有所不同(方法重载,即)。我认为使用这个模型会更清楚,我不确定装饰器。

答案 3 :(得分:0)

这是一个可以在理论和实践层面上回答的问题。理论上,请参阅http://en.wikipedia.org/wiki/Liskov_substitution_principle

但我认为你对练习很感兴趣。在这种情况下,问问自己,“是一个向导是一个角色”,也就是说,你可以用一个具有通用角色的向导做你能做的所有事情吗?如果是这样,那么继续并继承。这将允许您使用具有Character类型的更抽象代码而不是特定实例。当你想以各种方式组成可能的扩展子集时,装饰器会更有用,例如,如果你的情况下一个角色可以同时是神职人员,巫师,牧师和其他东西,等等。

答案 4 :(得分:0)

这取决于您希望RPG角色引擎的灵活性。如果您将角色类子类化,那么您将角色多样化限制为编译时间。但是,如果您使用设计模式(如装饰器或行为模式),则还可以通过组合装饰器或行为对象在运行时创建字符类。 (虽然你不会使用“巫师”装饰者而是使用“神奇”装饰来创造巫师,精灵等等。装饰者可以重复使用,这就是他们的力量。)

这实际上取决于你想要学习什么,基础类设计(子类字符)或现代面向对象设计(字符组合)。如果你是一个绝对的初学者,那就用第一种方法来了解原理。如果您已经了解这些原则,那么您应该抓住一本关于design patterns的好书并将其应用到您的游戏中。