2012-03-26 20 views
1

私はタイルシステムを使用するゲームを作成しています。各タイルは、その位置のVector2を持つオブジェクトです。私はリストにすべてのタイルを持っています。xとyの位置の値が与えられたxとyと一致するリスト内のオブジェクトのインデックスを見つける方法

タイルのグリッドにツリーを配置する必要があるVector2の束を生成する別のビットのコードがあります。すべてのツリーの位置はList内のVector2にあります

私の質問は、ツリー座標のリストの座標と完全に一致するタイルのインデックスを見つける方法です。一度見つけたら、リスト内のオブジェクトをそのtreePresentブール値をtrueにするように指示することができます。

タイルgridPosition.XとgridPosition.Y: 0(1,9)1(1,10)2(2,1)、3(2,2)

木treePosition.X and treePosition.Y: 0(1,9)1(2,2)

私は次に言うことができる: tileList [0] .treePresent = true; tileList [3] .treePresent = true;

答えて

2

あなたは周りのものを移動する場合、これは問題を引き起こす可能性がフロートの平等のために比較することを注意してください

tileList.Where(t => treeList.Contains(t.Position)); 

を試してみてください。

2

2次元リストを作成し、ツリー位置だけでタイルを参照することもできます。グリッドサイズを変更しない限り、動的リストを使用する必要はなく、代わりに2次元配列を作成することができます

3

タイルシステムを使用するゲームでは、タイルを追跡するための動的システム(リスト)を使用すべきではありません。 私は、「タイルシステム」とは、ゲームの世界/地図全体を2Dグリッドに分割したものを指しています。この理由は2つあります。

  1. 完全なデータマップを格納するためにより多くのメモリを使用する可能性があります。あなたの世界で実際にはあまり進んでいない場合、空白/デフォルトの背景タイルしか表示されない場合(80%以上)、このルールは無効であることが証明されます。しかし、妥当な量のデータ(私がここで仮定しているもの)のすべてのケースでは、タイルタイプを格納するだけでなく、タイルタイプを格納するのではなく、x座標&を使用する必要があります。
  2. 動的なデータ構造は非効率的です。特定のタイルを見つけるためにリスト全体をループする必要があるので、タイルデータの取得にはこの方法で時間がかかります。だから、タイル(a、b)が必要な場合は、すべてのタイルをループし(正しいタイルを見つけたら停止する)、各タイルの各(x、y)を(a、b)と比較する必要があります。非常に効率的ではありませんか?

解決策は簡単です。 タイルの2D配列を作成します。最初の次元はx座標のためのもので、2番目の次元はyのものです。

たとえば、 worldData [x] [y](または選択した言語に相当する)。このようにして、タイルを見つけることは非常に瞬時です。ここでtile(a、b)が必要な場合は、単にworldData [a] [b]を呼び出します。ループや比較は必要ありません。

質問がありますか?

+0

タイルオブジェクトをタイルオブジェクトの特定の座標に関連付けると、タイルオブジェクトを呼び出すことができるようになります。 すべてのタイル位置の2darrayを作成しますか?もしそうなら、タイルはそれがどのようにそれを知っていますか? 私はC#配列自体がかなり新しいので、主にそれを呼び出すことについてのあなたの最後の数行を理解していません。私はリストの使用にかなり慣れてきました。 –

+0

私はC#の構文を自分では分かっていないかもしれませんが、誰かが助けてくれるかもしれません。しかし、配列の背後にある基本的な考え方は、それが特定の変数またはオブジェクトのセットであるということです。したがって、10個の整数要素を持つ1次元配列を作成した場合、intArray [0]、intArray [1]、intArray [2]などのようにアクセスできます(intArrayは単に配列に対して定義した名前です) 。 2つのインデックス(intArray [0] [0]、intArray [1] [0]、intArray [0] [1]など)を除いて、2D配列も同様です。 – Denzil

+0

1000タイルの世界がほしいと言っています。タイルクラスを最初に作成します。第二に、タイルの配列を作ることができます。また、各タイルに一意のIDがある場合は、そのIDを代わりに使用することもできます。 ID 0は草、ID 1は水、ID 2は樹木などです。次に、上で説明したように2D整数配列を作成できます(配列宣言の詳細はわかりませんが自分で調べなければなりませんC#構文)。次に、tiles [0] [0] = 1と言うことができ、この例では水であるID 1mに位置(x = 0、y = 0)にタイルを設定します。 – Denzil

関連する問題