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;
それはほとんどすべての場合に十分です。