2017-11-19 14 views
1

私は現在、アンドロイド用にJavaで2Dゲームエンジンを作成しています。エンジンは基本的にエンティティコンポーネントシステムです。最初に、コンポーネントタイプを関連付けることができる青写真(idのラッパー)を作成します。後で青写真を「構築」することができます。これは、青写真に関連付けられた各タイプのオブジェクトが初期化され、更新ループに置かれることを意味します。コンポーネントにアクセスできるエンティティ(int idのラッパーも)が返されます。コンストラクタを指定して後で初期化する(Java)

コンポーネントを追加するときに、オブジェクトは初期化されません。つまり、その時点でコンストラクタを提供できないということです。これは何とか解決したいものです。

これは私が現在青写真とコンポーネントタイプを関連付ける方法を示します。

public <T extends Component> void addComponent(BluePrint bluePrint, Class<T> type) { 
    bluePrintMap.get(bluePrint.getId()).add(type); 
} 

Idはメソッドの参照を返すか、単にaddComponentの引数としてコンストラクタのパラメータを提供し、後で使用できるように保管しておきたいです。私は事前にコンストラクタの引数の長ささえ知っていないので、私はこの問題にどのようにアプローチするのか分かりません。すべての入力が肯定されます。

編集: 実際にコンポーネントのインスタンスを作成し、後でユーザーが青写真を作成するとコピーを作成することが考えられますが、これは私にとってはいくつかの問題を引き起こします。

+0

1)一般的なアプローチが有効です。 2)引数の数が可変なメソッドを使用すると、「どのように多くの引数があるかわからない」問題が解決される可能性があります(https://docs.oracle.com/javase/8/docs/technotes/guides/language/varargsを参照)。 .html)、または 'Collection'または配列オブジェクトを渡すことによって。 –

+0

@StephenC正しい方向に私を指摘してくれてありがとう – Tagor

+0

私はあなたの質問に従っているかどうかはわかりませんが、作成するときに呼び出される工場の役割を果たす 'Supplier 'を渡すことができますコンポーネント? –

答えて

0

最後に、私は編集で提供されたソリューションに行ってきましたが、これまでのところうまく動作しているように見えますし、タイプセーフティも得意です。欠点は、 スクリプトコンポーネントを作成するときにユーザーにとって使いやすいものにしたいのですが、エンジンが遅いところからシリアル化を使用してコピーを実行する必要があると思います。

関連する問題