如何在RPG游戏中设计攻击等级?


37

我正处于一个小型RPG风格游戏的计划阶段。

角色将具有一组以整数表示的属性,例如强度,敏捷性等。角色还将具有一组表示为攻击等级的攻击。

在每次攻击中,我希望它根据角色属性造成伤害,例如:攻击“剑斜线”将造成10 dmg +角色强度值。

我想到的方法是拥有一个抽象的攻击类,该类具有一个抽象的Attack方法,并且对于每种攻击,我都会创建一个实现Attack方法的类。

public class SwordSlash:Attack
{
    public void Attack(Character attacker, Character defender)
    {
        defender.DoDamage(10 + attacker.Strength);
    }
}

我看到这将使其成为噩梦。

有谁知道我如何更好地做到这一点?

我认为主要的问题是如何根据攻击来输入正确的属性。

Answers:


34

您可能应该在这里进行数据驱动的设计。

制作一个通用的Attack类,其中包含您要使用的参数-基本损坏,影响损坏的统计数据,一组潜在的状态影响...类似这样的东西:

public enum AttackStat
{
  Strength,
  Agility,
  Intellect
  // etc.
}

public class Attack
{    
  private int baseDamage;
  private AttackStat stat;
  private double damageMultiplier;
  // ...and so on

  public void Attack(Character attacker, Character defender)
  {
    defender.DoDamage(baseDamage + attacker.GetStatValue(stat) * damageMultiplier);
  }    
}

// Put a method on Character to fetch the appropriate value given an AttackStat:
public int GetStatValue(AttackStat s)
{
  switch(s)
  {
    case AttackStat.Strength:
      return strength;
    case AttackStat.Agility:
      return agility;
    // etc.
  }
}

然后,将攻击置于文件(例如XML文件)中,并从那里加载数据:

<Attacks>
  <Attack name="Sword Slash" damage="10" stat="Strength" multiplier="1" />
  <!-- More attacks here -->
</Attacks>

您甚至可以扩展它以从多个统计数据(例如,火球)中提取值,该数据是根据智力统计数据和火统计数据计算得出的:

<Attack name="Fireball" damage="20">
  <StatModifier stat="Intellect" multiplier="0.4" />
  <StatModifier stat="Fire" multiplier="0.8" />
</Attack>

如果您不希望对所有事物使用相同的基本伤害公式(例如,以不同于物理伤害的方式计算魔法伤害),请为所需的每个公式创建Attack的子类并覆盖Attack,然后在XML文件中指定所需的类型。


1
+1,但我什至会用某种查找表替换GetStatValue以避免维护该switch语句。

1
这种方法的问题在于,您只能受到通用的数据驱动攻击-您不能拥有任何使用特殊逻辑的东西。您最终将获得一组非常通用的物品(随着您进入魔兽世界
Iain 2010年

2
@Iain:只需添加更多数据即可轻松解决。例如,您可能有一个SpecialAttack子类,它可以做更多的事情,或以完全不同的方式计算损害。只需确定所需的行为,然后将其表示为数据即可。
Michael Madsen 2010年

2
@Iain:除了添加更多字段之外,您还可以通过一些数据字段(例如Lua中的表达式或代码块)来解决该问题。正确使用正交分量也可以得到更有趣的结果。

1
+1表示受数据驱动的一般想法。我不同意建议xml。有更好的格式-yaml,json或普通的.lua文件(如果要嵌入Lua)。
egarcia 2011年


2

我将拥有一个具有攻击方法的武器类,您可以用所需的行为来覆盖它。然后,您还可以处理武器在游戏中的外观,存货,在同一等级中的售价等。


6
-1,这不仅不是数据驱动的,而且是深度层次结构,而不是组件驱动的。这是最糟糕的解决方案。

4
仅仅因为这种特定的方法不是由数据驱动的,并不意味着它是一个错误的选择,而且层次结构也不会那么深。如果操作正确(即没有硬编码的值),它很简单,但仍然功能强大(UnrealEngine是一个很好的例子)。当然,它有其缺点,但我确信在数据驱动系统的开发周期中,它的缺点是可以证明的。我认为您的基本OOP设计仍然是一个有效的解决方案,如果他想即时编辑默认值,则可以轻松地在层次结构系统上实现它。
大林Seivewright

6
并非所有内容都必须由数据驱动-它取决于游戏的规模。认为我的回答是“错误的”可能有点自大,但感谢您的诚实。我认为这只是在对我有用的,每天制作Flash游戏的方式和您更传统的开发模式之间的风格冲突。我可以告诉您,我的方法实施起来要快得多,并且您可以进行更好的编译时检查。您的评论重新。Lua假定询问者正在一个支持该请求的平台上工作。
伊恩

2
作为一款RPG游戏,实现这样的每个项目可能非常不切实际。
沃恩·希茨

1

我真的很陌生,但是我要做的是创建一个通用的攻击类。

当一个角色实例想要攻击另一个角色实例时,它将创建攻击类的实例,并填充所需的数据以及创建该角色的角色的ID。然后,使用可以在xml文档或类似文件中输入的数据,将齿轮的调整应用于攻击对象。

然后,该类实例将包装在另一个类中,以为环境提供钩子以确定范围或类似范围。如果攻击是有效的,则攻击实例将传递给被攻击的角色,角色将应用效果。

希望有道理。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.