わかりました、このように定式化されているので、はっきりしないように思えますが、問題を説明するために最善を尽くします。
まず、実際のソースコードの何が問題かを説明しましょう。
私はプラットフォーマーを作っています。これが私のゲームの現在のコンポーネントです:タイルの独自のグリッドとタイルシートを保持しているLevelと、タイルシートの名前とインデックスを保持するTileだけです。タイルシート。これらはすべて、GameLibという名前の個別のXNAゲームプロジェクト内にあります。
レベルがテキストファイルでフォーマットされる方法は次のとおりです。
x x . . . . .
. . . b g r .
. . . . . . .
X X X X X X X
ここでは.
、空のタイルを表すb
青色のプラットフォームを表し、X
ランダムな色のブロックを表し、等
Levelクラス内でレベルをロードするすべての作業を行う代わりに、コンテンツパイプライン拡張を利用して、LevelContentPipelineExtensionを作成することにしました。
始めてすぐに、次のような20行以上をハードコーディングしたくないことにすぐに気付きました。
if (symbol == 'b')
return new Tile(/*...*/);
したがって、すべてのコンテンツ作成を少なくとも1つのクラスに集中させることを期待して、どのシンボルが何を作成し、この種のすべてのものを作成するかに関する情報を保持するLevelContentCreationと呼ばれる静的クラスを作成しました。また、後で読み込むために、タイルシートのすべてのアセットパスのリストを保持します。このクラスは、私のGameLibゲームライブラリプロジェクト内にあります。
問題は、このLevelContentCreation静的クラスをLevelクラス(実際のタイルシートを読み込むため)とコンテンツパイプライン拡張(どのシンボルがどのタイルを表すかを知るため)の両方で使用していることです...
そして、LevelContentCreationクラスは次のようになります。
public static class LevelContentCreation
{
private static Dictionary<char, TileCreationInfo> AvailableTiles =
CreateAvailableTiles();
private static List<string> AvailableTileSheets { get; set; }
/* ... rest of the class */
}
これで、LevelContentCreationクラスはゲームライブラリの一部であるため、コンテンツパイプライン拡張機能がそれを使用しようとしますが、CreateAvailableTiles()の呼び出しは発生せず、コンテンツパイプラインからLevelオブジェクトをロードできません。
これは、実際のコンパイルなどの前にコンテンツパイプラインが実行されるためですが、問題を解決するにはどうすればよいですか?
LevelContentCreationクラスをパイプライン拡張に実際に移動することはできません。それは、Levelクラスがそれを使用できないためです...私はかなり迷っていて、どうすればいいのかわかりません...これらはわかっています。かなり悪い設計上の決定です。誰かが私を正しい方向に向けてくれたらいいのですが。
貴重なお時間ありがとうございました。
不明な点がある場合や、詳細情報やコードを提供する必要がある場合は、下にコメントを残してください。
私のプロジェクトに関するもう少し情報:
- ゲーム -XNA Windowsゲームプロジェクト。への参照が含まれています:Engine、GameLib、GameContent
- GameLib -XNAゲームライブラリプロジェクト。への参照が含まれています:エンジン
- GameContent -XNAコンテンツプロジェクト。次への参照が含まれています:LevelContentPipelineExtension
- エンジン -XNAゲームライブラリプロジェクト。参照なし。
- LevelContentPipelineExtension -XNAコンテンツパイプライン拡張。への参照が含まれています:EngineおよびGameLib
XNA 4.0についてはほとんど何も知りませんが、コンテンツがどのように機能するかについて少し迷っています。さらに情報が必要な場合は、教えてください。