RPGゲームで攻撃クラスを設計する方法は?


37

私は小さなRPGスタイルのゲームの計画段階にいます。

キャラクターには、強度、敏strength性など、整数として表される一連の属性があります。キャラクターには、攻撃クラスとして表される一連の攻撃もあります。

各攻撃で、キャラクターの属性に基づいてダメージを与えたい。例えば、攻撃「ソードスラッシュ」は、10 dmg +キャラクターの強さの値を与える。

私がこれをしようと考えていたのは、抽象攻撃メソッドを持つ抽象攻撃クラスを作成することであり、攻撃ごとに、攻撃メソッドを実装する1つのクラスを作成します。

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

これは維持するのが悪夢になると思います。

誰が私がこれをより良い方法で達成できるかについてのアイデアを持っていますか?

主な問題は、攻撃に基づいて正しい属性を入力する方法だと思います。

回答:


34

ここでは、おそらくデータ駆動型の設計に行く必要があります。

使用したいパラメーターを含む一般的な攻撃クラスを作成します-基本ダメージ、ダメージに影響する統計、潜在的なステータス効果のセットなど...

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>

これを拡張して、複数の統計、たとえば、ダメージがIntellectとFireの両方の統計から計算されるFireballから値を引き出すこともできます。

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

すべてに同じ基本的なダメージ式を使用したくない場合(物理的ダメージとは異なる魔法のダメージを計算するなど)、必要な各式に対して攻撃のサブクラスを作成し、攻撃をオーバーライドし、XMLファイルに必要なタイプを指定します。


1
+1。ただし、GetStatValueをある種のルックアップテーブルに置き換えて、switchステートメントを維持しないようにします。

1
この方法の問題は、一般的なデータ駆動型の攻撃しかできないということです。特別なロジックを使用するものは何も持てません。最終的には非常に一般的なアイテムのセットになります(warcraftで取得するように
イアン

2
@Iain:これを許可するためにデータを追加するだけで、非常に簡単に解決できます。たとえば、より多くのことを行うSpecialAttackサブクラスがある場合や、まったく異なる方法でダメージを計算する場合があります。必要な動作を特定し、それをデータとして表現するだけです。
マイケルマドセン

2
@Iain:フィールドを追加するだけでなく、データフィールドの一部をLuaなどの式またはコードブロックにすることでも解決できます。直交成分を適切に使用すると、さらに興味深い結果が得られます。

1
データ駆動型であるという一般的な考え方に対して+1。xmlの提案に同意しません。Luaを埋め込む場合は、yaml、json、またはプレーンな.luaファイルがあります。
エガルシア


2

あなたが望む振る舞いでオーバーライドする攻撃メソッドを持つ武器クラスがあります。また、同じクラスのゲーム内、インベントリ内、武器の販売状況などで武器の外観を処理することもできます。


6
-1は、これがデータ駆動型ではないだけでなく、コンポーネント駆動型ではなく、深い階層です。最悪の解決策です。

4
この特定のメソッドがデータ駆動型ではないからといって、それが悪い選択になるわけではなく、階層はとにかくそれほど深くはありません。正しく行われた場合(つまり、ハードコーディングされた値がない場合)、シンプルですが強力です(UnrealEngineはこれの完璧な例です)。確かに欠点はありますが、データ駆動型システムの開発サイクルのさらに下では、その欠点が明らかになっているはずです。基本的なOOP設計はこれでまだ有効なソリューションであり、デフォルト値のオンザフライ編集が必要な場合は、階層システムの上に簡単に実装できます。
ダリンセイブライト

6
すべてがデータ駆動型である必要はありません-ゲームの規模に依存します。私の答えが「間違っている」と考えるのはおそらくbit慢ですが、誠実さをありがとう。これは、私にとって効果的なもの、毎日Flashゲームを作成するもの、そしてより伝統的な開発モデルの間のスタイルの衝突に過ぎないと思います。私のアプローチは実装がはるかに速く、コンパイル時のチェックが優れていると言えます。コメントを再。Luaは、アスカーがそれをサポートするプラットフォームで作業していると想定しています。
イアン

2
RPGゲームであるため、そのようなすべてのアイテムを実装することはおそらく非常に非現実的です。
ヴォーンヒルツ

1

私はこれに本当に新しいですが、私がそれをする方法は、一般的な攻撃クラスを作成することです。

あるキャラクターインスタンスが別のキャラクターインスタンスを攻撃したい場合、攻撃クラスのインスタンスを作成し、必要なデータとそれを作成したキャラクターのIDを入力します。次に、XMLドキュメントなどに入力できるデータを使用して、ギアからの調整が攻撃オブジェクトに適用されます。

次に、このクラスインスタンスは別のクラス内にラップされ、環境が範囲などを決定するためのフックを提供します。攻撃が有効な場合、攻撃インスタンスは攻撃されているキャラクターに渡され、キャラクターはエフェクトを適用します。

それが理にかなったことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.