より効率的なアプローチは、Entity Component Systemを使用するか、少なくとも合成デザインを借りることです。これにより、例えばAbility
のような1つの具象クラスを持つことができます。このクラスには、すべての能力に共通の一般的なフィールドが含まれます。スキルポイントコスト、能力の持続時間、ターゲットタイプ、アクティベーションタイプなどを追加する必要があります。追加する必要のある特別な値ごとのコンポーネントと、その汎用的な能力に追加する必要のある各特殊な動作のコントロールがあります。例:
Ability ability = new Ability();
ability.addComponent(new DurationComponent(double seconds)); // specify how long effect lasts
ability.addControl(new DamagingControl(int damage, Object targetType, etc.)); // so ability can damage
ability.addControl(new ElementAugmentingControl(Element element, Object weapon/armor, etc.)); // so ability can change status effects/elements
これはあなたに構図のアイデアを与えるはずです。あなたの能力の共通の行動に基づいて、あなたは約10-30のクラスで終わるべきですが、400の能力は基本的なジェネリック能力の構成になります。あなたに例を挙げると、およそ100の能力(技能)を持つRPGが6つのクラスとして実装されています。同じデザインはどのゲームアイテム/キャラクターにも使用できます。
オブジェクトを作成するためとして、あなたが行うことができます:
public static final int ABILITY_ID_SOME_NAME = 1000;
ability.addComponent(new IDComponent(ABILITY_ID_SOME_NAME));
は、その後、あなたの能力のそれぞれが能力のみプロトタイプが格納されているグローバルデータストアの一部とすることができる。また
Ability ability = DataStore.getByID(ABILITY_ID_SOME_NAME).clone();
、プロトタイプを公開しないように、データストアに既に複製された機能を返すようにします。
最後に、スクリプト言語を使用することを検討することができます。 javascriptを使用してジェネリック能力の動作を変更します。この場合、すべての能力は実行時にロードするフォルダscripts/abilities/
に格納され、必要なものだけが格納されます。いくつかの任意の例:(heal.jsファイル)
function onUse(object, healValue) {
if (object.hasComponent(HP_COMPONENT)) {
val hp = object.getComponent(HP_COMPONENT);
hp.value += healValue;
}
}
は、ここでのjava内のJavaScript関数を呼び出す方法を示しarticleです。
@PhilipVaughnもう少し明確にすることはできますか?実際にクラスをロードするのではなく、オブジェクトを作成することを求めているのでしょうか?あなたは現在の答えの下のコメントで "フォルダ内のすべてのファイルを取得して新しいクラスにキャストする*ファイル*を動的に読み込む"という意味はどうですか?クラスにファイルをキャストすることはできません(クラスへのオブジェクト参照をキャストできます)。どのように "ファイル"をキャッシュにロードしていますか? –