0

私のゲームでは、マップを設定するためにテキスト ファイルを読み込んでいます。テキスト ファイルはコンマで区切られた一連の文字で、各文字はゲーム内のタイルを表します。たとえば、マップ ファイルのセクションは次のようになります。

fr、g、g、

g,fy,w,

g、g、w、

ここで、「fr」は花の赤、「g」は草、「w」は水などを表します。問題は、マップが表示されるマップのセクションよりもはるかに大きいことです。たとえば、マップ ファイルは次のようになります。

g,g,g,w,g,g,fr

g,fy,w,w,g,g,g

g,g,w,g,g,fr,g

g,g,fy,g,g,w,g

ただし、一度にこれらのタイルの 3x3 セクションのみを表示するので、たとえば、上記のマップ ファイルの 3x3 セクションをマップの右上に表示できます。これがタイルになります。

g,g,g,w, g,g,fr

g,fy,w,w, g,g,g

g,g,w,g, g,fr,g

g,g,fy,g,g,w,g

しかし、このファイルを 1 次元配列 (Objective-C には 2D 配列はありません) に読み込むため、表示したいセクションのインデックスを特定する方法がわからないという問題があります。

したがって、このマップは内部的に次のように表されます (太字の文字は表示される文字です)。

g,g,g,w, gz,g,fr ,g,fy,w,w, g,g,g ,g,g,w,g, g,fr,g ,g,g,fy,g, g、w、g

開始文字を「z」で識別しているため、右上のセクションを表示する場合、上のマップは次のようになります。

g,g,g,w, gz,g,fr

g,fy,w,w, g,g,g

g,g,w,g, g,fr,g

g,g,fy,g,g,w,g

私の質問は、表示したいセクションを構成する文字のインデックスを特定するにはどうすればよいですか?

編集: @テッドの答えに従ってコードを修正しましたが、結果は奇妙です。これは私が作成したアルゴリズムです:

NSMutableArray *nodes = [[NSMutableArray alloc] init];
int tilesAcross = DEVICE_WIDTH/TILE_WIDTH;
int tilesUp = DEVICE_HEIGHT/TILE_HEIGHT;

int startX = self.renderer.indexOfStartNode / BIOME_WIDTH;
int startY = self.renderer.indexOfStartNode % BIOME_WIDTH;

for(int index = 0; index < self.entireMap.count; index++) {

    int currentX = index / BIOME_WIDTH;
    int currentY = index % BIOME_WIDTH;

    if((currentX > startX && currentX <= (startX + tilesAcross)) && (currentY > startY && currentY <= (startY + tilesUp))) {

        [nodes addObject:[self.entireMap objectAtIndex:index]];
    }
}
4

1 に答える 1

1

wが行ごとに線形配列に格納されている行列の場合、次の式を使用して、線形インデックスiと座標の間で相互に変換できます。rowcolumn

i = row * w + column
row = i / w
column = i % w

これは、ゼロベースのインデックス作成に有効です。

于 2013-04-24T02:52:13.990 に答える