2016-09-24 17 views
1

私はJavaFXでRPGを構築しており、専門家からアドバイスを受ける必要があります。Java Game Design Class Loading

特定のリソースをロードする適切な方法は何ですか?私はイメージとサウンドについて話しているわけではなく、その部分は簡単です。私はクラスについて話しています。例えば;私はあなたが活性化できるいくつかの奇妙な400以上の能力を持っています。私はそれぞれの能力(または私がそれらを呼び出すときにアルテ)のための別のクラスを持っています。私は

Data.getArte(idOfArte); 

を呼び出すことができるようにしたい。この機能にアクセスするには、これはタイプアルテのオブジェクトを返す必要があります。すべての芸術作品には、セパルテクラスのファイルがあります。

ヒーロー、エネミーなどのように、この方法でも他のリソースがあります。これらのリソースをロードして使用するための最良の方法は何でしょうか?これを行うより良い方法はありますか?

編集:私もパフォーマンスに非常に関心があります。

+0

@PhilipVaughnもう少し明確にすることはできますか?実際にクラスをロードするのではなく、オブジェクトを作成することを求めているのでしょうか?あなたは現在の答えの下のコメントで "フォルダ内のすべてのファイルを取得して新しいクラスにキャストする*ファイル*を動的に読み込む"という意味はどうですか?クラスにファイルをキャストすることはできません(クラスへのオブジェクト参照をキャストできます)。どのように "ファイル"をキャッシュにロードしていますか? –

答えて

3

より効率的なアプローチは、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です。

+1

申し訳ありませんが、ここで答えを受け入れるには時間がかかりました(笑)私は何をすべきかと苦労してきましたが、あなたの答えは私を最も魅了しました。私は自分自身をベテランのプログラマー(CSの学位を持っていても)だと思っていますが、これと全く同じようなことは一度もありません(本当に残念です)。それはいくつかのクラスの少しの再作業を取るだろうが、これは(私が信じる)かなり効率的だ。 –

1

あなたはファクトリパターンを探しています。私はここで良い記事を見つけました:http://alvinalexander.com/java/java-factory-pattern-example

実行時にクラスファイルをサイドロードする必要はないと思いますか?その場合、私はここで見てみることをお勧めします:Method to dynamically load java class files

+0

ええと...これは実際にはパッケージ化されたアプリケーションであると考えられています。 –

+0

あなたが与えたファクトリパターンの例を見ましたが、これは私が元々考えていたものでした。私は持っているファイルの量だけのために、このようなものを実装する必要があるかもしれません。現在、私はすでに動的にファイルを読み込み、フォルダ内のすべてのファイルを取得して新しいクラスにキャストしていますが、それらをすべてキャッシュにロードしているので長期パフォーマンスが心配です。 –