2013-05-29 2 views
0

Я использую класс CCTMXTiledMap для загрузки карт в игру cocos2d, которую я делаю. В рамках процесса я хотел бы перебирать свойства всех доступных фрагментов в наборах плиток, связанных с файлом карты .tmx, ВКЛЮЧАЯ те, которые в настоящее время не размещены на слое. Другими словами, я хочу знать max GID для фрагментов, связанных с картой.Итерировать все доступные плитки в cocos2d с помощью CCTMXTiledMap

Я хочу сделать что-то вроде:

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

Как определить minGID и maxGID, связанный с файлом .tmx?

+0

только плитки, у которых было одно или несколько свойств, добавленных в плитку, будут иметь словарь свойств. Вы хотите перечислить свойства или графики плитки? – LearnCocos2D

+0

Я хочу перечислить GID. Это нормально, если у них нет свойств. Я играю с атрибутами ' 'terrain, но хотел бы только прокручивать через плитки одноразовые свойства и информацию о местности. – Clay

+0

Некоторые из плиток не имеют свойств, но имеют информацию о местности. – Clay

ответ

2

Поскольку cocos2d ограничивается одним слоем на набора фишек, каждый мозаичный слой на самом деле имеет ссылку Tileset:

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

До сих пор, так хорошо. Но каков максимальный GID? Это можно получить для всех наборов элементов, за исключением последних, довольно легко. Предполагая, что у вас есть два слоя плитки с разными наборами плиток, тогда первый GID второго уровня, вычитаемый одним, является maxGID предыдущего уровня.

Для последнего слоя вы можете предположить, что maxGID - это количество возможных фрагментов в тайнике. Однако это не учитывает плитки, которые не полностью заполнены фактическими фрагментами. Другой вариант - перебрать все слои с помощью этого набора и записать самый высокий GID. Опять же, это неверно, потому что плитка с самым высоким GID на самом деле не может быть размещена на карте.

Единственное определенное решение для этого - добавить фиктивный слой и добавить к нему наивысший GID на 0,0, а затем проверить метку GID этой позиции на фиктивном уровне. Вот как вы точно знаете, что такое самый высокий GID для плитки. Если в процессе нет человеческой ошибки, и вы не забудьте обновить плитку, если вы добавите больше плиток в тайник.

Единственный способ точно выводить эту информацию программно - это сканирование текстуры и исключение всех неиспользуемых плит, путем проверки каждой области плитки и поиска первого полностью прозрачного или одиночного (определенного) цвета. Это будет работать, только если ваш таймер будет заполнен слева направо, сверху вниз, без каких-либо «пустых» фрагментов между ними.

Из всех этих вариантов один я использую в KoboldTouch, чтобы просто предположить, что Tileset с самым высоким наиболее firstGID значение полностью заполнен плитки, то есть lastGID будет:

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

Этого достаточно для почти во всех случаях.

+0

Да! Это то, к чему я стремился. Большое спасибо за подробное объяснение. – Clay

+0

Я полагаю, что CCTMXTiledMaps не должны изменяться во время выполнения. Нет ли способа динамически и детерминистически менять плитку для другого во время выполнения? Я хочу, чтобы пользователь мог выбирать полы из HUDMenu: / – Eyeball

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]; 

     // 
    } 
} 
+0

Вправо - но это только фиксирует плитки, которые размещены на карте. Я хочу захватить все плитки, которые можно разместить на карте. – Clay

+1

этот код работает, он просто вернет TID GID 0 для пустых плит, но он перебирает все плитки.Игнорируйте часть propertiesForGID. – LearnCocos2D

+0

Думаю, я не очень хорошо объясняю себя, и извиняюсь за это. Для этого использования меня не интересуют плитки, которые фактически размещены в координате карты. Меня интересуют все плитки в наборе плиток - те, которые будут перечислены, если я буду экспортировать файл '.tsx'. Похоже, что он выполняет итерацию через все координаты карты. – Clay

Смежные вопросы