Tiled / pytmx — проблема с получением одинакового gid для одного и того же изображения на разных картах

#python #tiled #tmx #pytmx

#python #tiled #tmx #pytmx

Вопрос:

Я всегда получаю gid == 1 для первого элемента в картах, даже с тем же набором листов. Сохраненный файл «example.tmx» имеет значение, закодированное с помощью CVS. Я открываю файл с помощью текстового редактора, и он выглядит так:

 <data encoding="csv">
24,24,19,24,24,22,19,23,18,23,2
...
  

Это здорово. Первый элемент — 24-я плитка.
Но когда я загружаю карту с помощью pytmx и пытаюсь получить x, y, gid, все по-другому.

 ti = self.tmxdata.get_tile_image_by_gid
for layer in self.tmxdata.visible_layers:
            #print(layer.name)
            if layer.name == "layer1": 
                for x, y, gid in layer:
                    print(x, y, gid, self.id)
                    tile = ti(gid)
                    #print(self.tmxdata.get_tileset_from_gid(gid))
                    #print(tile)
                    if tile:
                        surface.blit(tile, (x * self.tmxdata.tilewidth   (yamp;1) * self.tmxdata.tilewidth / 2, y * self.tmxdata.tileheight / TILESIZE[0] * TILESIZE[1]))
                    self.id  = 1
  

Печатные значения (first == x, second == y, third == gid, last == id):

 0 0 1 0
1 0 1 1
2 0 1 2 ...
  

И это для всех карт, первый gid всегда равен «1», но он описывает разные плитки на разных картах.

С помощью ti(gid) / get_tile_image_by_gid получается правильное изображение. Но я хочу использовать номер gid для других мыслей, таких как:

 if gid == 1:
    self.grass_group.append(...)
else:
    self.other_group.append(...)
  

Ответ №1:

Хорошо, я решил это.

В pytmx «register_gid» у меня не работает должным образом. Мне нужно было составить такой список:

 self.listtiles = [z for z in tm.gidmap]
  

И затем, когда я просматриваю каждый элемент в layer, я могу получить его из этого списка.

 if layer.name == "layer1": 
    for x, y, gid in layer:
        # old wrong
        print(x, y, gid, self.id)   
        # new correct
        print(x, y, self.listtiles[int(gid - 1)], self.id)    
        tile = ti(gid)
        if tile:
            surface.blit(tile, (x * self.tmxdata.tilewidth   (yamp;1) * self.tmxdata.tilewidth / 2, y * self.tmxdata.tileheight / TILESIZE[0] * TILESIZE[1]))
        self.id  = 1
  

Ответ №2:

Pytmx странный. Довольно сложно получить идентификатор плитки (вероятно, bcz может быть несколько плиток)

Это то, что я нашел.

 tmx_data = #load tmx data
gid_to_id_map = list(tmx_data.gidmap) # get list of keys

def get_id(gid): #index is supposed to mean id
    if gid != 0: #getting id for 0 is very strange
        index = tmx_data[gid-1]-1
    else: index = -1
    return index
# this is so stupidly complicated