0

このクラスを使用して、CCTMXTiledMap作成中の cocos2d ゲームにマップをロードしています。プロセスの一環として、マップ ファイルに関連付けられているタイル セット内のすべての利用可能なタイルのプロパティを反復処理したいと考えています.tmx。現在レイヤーに配置されていないものも含まれます。つまり、マップに関連付けられたタイルの最大 GID を知りたいのです。

私は次のようなことをしたい:

for (int i = minGID; i < maxGID + 1; i++) { 
    ... do something with the tiles by calling their GID... 
}

ファイルに関連付けられている minGID と maxGID を確認するにはどうすればよい.tmxですか?

4

2 に答える 2

2

cocos2d はレイヤーごとに 1 つのタイルセットに制限されているため、各タイル レイヤーには実際にはタイルセット リファレンスがあります。

CCTMXLayer* floorLayer = [tilemap layerNamed:@"floortiles"];
CCTMXTilesetInfo* tileset = floorLayer.tileset;
uint32_t firstGID = tileset.firstGID;

ここまでは順調ですね。しかし、最大 GID は何ですか? これは、最後のタイルセットを除くすべてのタイルセットでかなり簡単に取得できます。異なるタイルセットを持つ 2 つのタイル レイヤーがあると仮定すると、2 番目のレイヤーの firstGID から 1 を引いた値が、前のレイヤーの maxGID になります。

最後のレイヤーでは、maxGID がタイルセット内の可能なタイルの数であると想定できます。ただし、これは実際のタイルで完全に満たされていないタイルセットを考慮していません。もう 1 つのオプションは、このタイルセットを使用してすべてのレイヤーを反復し、使用中の最高の GID を記録することです。最高の GID を持つタイルが実際にはマップ上に配置されない可能性があるため、これにも問題があります。

これを回避する唯一の明確な解決策は、ダミー レイヤーを追加し、それに 0,0 で最高の GID を追加してから、ダミー レイヤーのその位置のタイル GID をチェックすることです。これにより、タイルセットの最高の GID が何であるかを確実に知ることができます。プロセスに人的エラーがなく、タイルセットにさらにタイルを追加する場合はタイルを更新することを忘れないでください。

この情報をプログラムで正確に推測する他の唯一の方法は、テクスチャをスキャンし、各タイル領域をチェックして、完全に透明または単色 (特定の) 色の最初のタイルを見つけることによって、未使用のタイルをすべて除外することです。これは、タイルセットが左から右、上から下に塗りつぶされ、その間に「空の」タイルがない場合にのみ機能します。

これらすべてのオプションから、私がKoboldTouchで使用するのは、最も高い firstGID 値を持つタイルセットが完全にタイルで満たされていると単純に仮定することです。つまり、lastGID は次のようになります。

uint32_t lastGID = firstGID + (texWidth/tileWidth) * (texHeight/tileHeight) - 1;

それはほとんどすべての場合に十分です。

于 2013-05-29T23:06:36.433 に答える
2

これを試して:

int rowSize = self.mapSize.width/TILE_SIZE ;
int colSize = self.mapSize.height/TILE_SIZE ;

for(int i=0; i<rowSize;i++)
{
    for(int j=0; j<colSize; j++)
    {
        unsigned int tileGid = [self.meta tileGIDAt:ccp(i,j)];
        [[myMap propertiesforGID:tileGid] doSomethingCool];

        //
    }
}
于 2013-05-29T13:59:42.913 に答える