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

Я всегда получаю 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 + (y&1) * self.tmxdata.tilewidth / 2, y * self.tmxdata.tileheight / TILESIZE[0] * TILESIZE[1]))
                    self.id += 1

Печатные значения: (первый == x, второй == y, третий == gid, последний == 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(...)

person Maucin    schedule 21.09.2020    source источник


Ответы (1)


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

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

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

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

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 + (y&1) * self.tmxdata.tilewidth / 2, y * self.tmxdata.tileheight / TILESIZE[0] * TILESIZE[1]))
        self.id += 1
person Maucin    schedule 22.09.2020