【问题标题】:Java RPG Dynamic skills and design patternJava RPG 动态技巧与设计模式
【发布时间】:2013-11-27 09:58:55
【问题描述】:

我正在为我的学习开发一款 RPG 游戏,我们需要使用设计模式,并且我正在尝试编写动态角色技能。例如,我会有一些物品,当装备时,会添加角色以前没有的新技能(治疗......)。

为此,我想使用装饰器模式,但是有了这个,我们不能给一个类添加方法或属性,只需要修改那些已经存在的,对吧?

那么有没有动态的方法来做到这一点?

【问题讨论】:

    标签: java design-patterns


    【解决方案1】:

    那里有很多模式;你的老师有没有要求一个特定的模式或一组模式?此外,模式有时是有意义的。仅在它们有助于解决问题时才使用它们,而不是因为它们很酷。

    在这种情况下,可以使用装饰器。在您编写时,它们不应该添加外部方法或属性。所以你需要getHealingPower()getArmorValue() 等等,即使是裸体角色;每个包装的装饰器都会修改它关心的东西的返回值:HealingBookDecorator 将返回wrappedObject.getHealingPower() + 15。然而,我觉得他们在这个场景中很丑,因为角色无法移除治疗书以将其留在地板上,或者拿起一本更好的书。装饰对象通常不知道它们的装饰器。另外,如果你的角色被命名为bob,那么给他穿上StripedShirtDecorator(RedScarfDecorator(PolkaDotTrousersDecorator(bob)))会很奇怪。

    如果我必须实现这一点,每个Item 都会有一个String description 并包含一个Map<Stat, Integer> modifiers(其中Stat 是一个enum 的有效统计数据,例如治疗、护甲值、最大HP、等等)。一个Character 将有一个ArrayList<Item> inventory,一个Map<Stat, Integer> baseStats 他或她的基本统计数据,另一个Map<Stat, Integer> currentStats 将包含合并baseStatsmodifiers 的每个modifiers 在字符'库存,并且每次角色升级或从库存中添加或删除某些东西时都需要更新。

    要检查名为lisaSimpsonCharacterStat.MusicProficiency 的级别,您可以编写lisaSimpson.getStat(Stat.MusicProficiency);。这样做的好处是很容易添加新类型的项目(它们将是对象实例,而不是类),并且库存管理将大大简化。

    【讨论】:

    • 但是,您可以在绘制角色时使用装饰器 - 一个可以绘制衣服,另一个可以添加盔甲,另一个可以在顶部绘制一个 HP 条。这很好,因为角色永远不需要知道他是如何被画出来的......
    • 哇,这令人鼓舞。我对游戏开发还很陌生(几周前才开始),这正是我正在做的完全的方式——除了我使用的是 std::unordered_map 而不是枚举。太棒了!
    • @AmagicalFishy 趋同进化:-)。但是,我建议不要使用纯字符串,因为拼写错误会导致很多麻烦(“Armor”与“Armour”),并且使用枚举,您会收到编译时警告和自动完成。
    猜你喜欢
    • 2013-02-18
    • 2011-10-25
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多