Я думаю, что ответ @ gurbuz уже охватил большую часть этого, поэтому я представлю почти тот же ответ, но с моим собственным вращением;)
Итак, ваша карта TMX определяет сетку текстурированных плиток, которые составляютэкран, полный карты / уровня / что угодно.Как и керамическая плитка для пола, каждая из них обрабатывается индивидуально и укладывается на пол индивидуально.
Код в вопросе выглядит правильно, чтобы найти (0,0 / верхний левый) одинарный Плитка в нулевом слое карты и нарисовать его на экране.Я подозреваю, что это выдает ошибку для layer=1
, потому что карта содержит только один слой.Но без карты это невозможно узнать.
Чтобы показать всю карту, необходимо перебрать все плитки, определенные в файле .tmx
, и поместить их на поверхность.Затем эту поверхность можно просто .blit
~ привязать к окну Pygame.
Я собрал воедино эту основную функцию, которая загружает всю карту, отображая ее на поверхности.Это наивный способ сделать это, потому что это изображение может быть огромным .Но это служит для иллюстрации того, как пройти элементы карты и нарисовать их.
# Convert HTML-like colour hex-code to integer triple tuple
# E.g.: "#892da0" -> ( 137, 45, 160 )
def hexToColour( hash_colour ):
red = int( hash_colour[1:3], 16 )
green = int( hash_colour[3:5], 16 )
blue = int( hash_colour[5:7], 16 )
return ( red, green, blue )
# Given a loaded pytmx map, create a single image which holds a
# rendered version of the whole map.
def renderWholeTMXMapToSurface( tmx_map ):
width = tmx_map.tilewidth * tmx_map.width
height = tmx_map.tileheight * tmx_map.height
# This surface could be huge
surface = pygame.Surface( ( width, height ) )
# Some maps define a base-colour, if so, fill the background with it
if ( tmx_map.background_color ):
colour = tmx_map.background_color
if ( type( colour ) == str and colour[0].startswith( '#' ) ):
colour = hexToColour( colour )
surface.fill( colour )
else:
print( "ERROR: Background-colour of [" + str( colour ) + "] not handled" )
# For every layer defined in the map
for layer in tmx_map.visible_layers:
# if the Layer is a grid of tiles
if ( isinstance( layer, pytmx.TiledTileLayer ) ):
for x, y, gid in layer:
tile_bitmap = tmx_map.get_tile_image_by_gid(gid)
if ( tile_bitmap ):
surface.blit( tile_bitmap, ( x * tmx_map.tilewidth, y * tmx_map.tileheight ) )
# if the Layer is a big(?) image
elif ( isinstance( layer, pytmx.TiledImageLayer ) ):
image = get_tile_image_by_gid( layer.gid )
if ( image ):
surface.blit( image, ( 0, 0 ) )
# Layer is a tiled group (woah!)
elif ( isinstance( layer, pytmx.TiledObjectGroup ) ):
print( "ERROR: Object Group not handled" )
return surface
Так что, как только карта «преобразована» в поверхность, можно просто перетянуть эту поверхность в пигмеюscreen:
# Before the main loop starts
tmx_map = pytmx.load_pygame( "test.tmx", pixelalpha=True )
map_image = renderWholeTMXMapToSurface( tmx_map )
# Main loop
while not finished:
...
pygame_screen.blit( map_image, ( 0, 0 ) )
...
Лучший способ сделать это - загрузить только элементы карты TMX, необходимые для отображения.Легко записать, какие подчиненные координаты карты отображаются, а затем перейти к генерации - скажем, столбец с правой стороны, когда это должно появиться.