Home > Mobile >  Why do my tiles render like this in pygame?
Why do my tiles render like this in pygame?

Time:01-22

This code here generates a tiled map

for tiley in range(0,len(level)):
    for tilex in range(0,len(level[tiley])):        
        for tiletype in level[tiley]:
            if tiletype == 0:
                screen.blit(air, ((tilex*50,tiley*50)))
            if tiletype == 1:
                screen.blit(grass, ((tilex*50,tiley*50)))

from this 2D list.

level = [[1,0,1,1,0,1,1,1,0,1,1,1,1,0,1,1],[1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0]]

The pygame window, however, displays a different tilemap entirely from the list provided. Why does it do this?

CodePudding user response:

It looks like you have an extra level of iteration beyond what you need; you only want to loop for x and y, and blit once at each coordinate. Like this:

for tiley in range(len(level)):
    for tilex in range(len(level[tiley])):
        if level[tiley][tilex] == 0:
            screen.blit(air, (tilex * 50, tiley * 50))
        else:
            screen.blit(grass, (tilex * 50, tiley * 50))

However, you could also make your code cleaner, I think, by avoiding the range(len(...)) antipattern:

for y, row in enumerate(level):
    for x, cell in enumerate(row):
        if cell == 0:
            screen.blit(air, (x * 50, y  * 50))
        else:
            screen.blit(grass, (x * 50, y * 50))
  •  Tags:  
  • Related