Why is pygame display not bliting properly?

65 views Asked by At

I am trying to make a tile-based 2d platformer in Python with Pygame. I've started with just creating the window and tile system. It refers to a text file, and based on each number found in the file, blits an image to the Pygame display window("2" for grass image, "1" for dirt image). When the program is executed, the tiles appear on the screen but rapidly flash and move slowly to one side. There are also gaps in between the tiles too, which I am not sure why they are there, but I want to get rid of them.

import pygame, sys
pygame.init()

dirt_img = pygame.image.load("dirt2.png")                  #loads dirt image
dirt_img = pygame.transform.scale(dirt_img, (80,80))       #scales dirt image up to 80*80

grass_img = pygame.image.load("grass2.png")                #loads grass image
grass_img = pygame.transform.scale(grass_img, (80,80))     #scales grass image up to 80*80

clock = pygame.time.Clock()                              

window = pygame.display.set_mode((1200, 800))


#load map
def load_map(path):
    f = open(path + '.txt','r')             #open text file
    data = f.read()                         #reads it
    f.close()                               #closes
    data = data.split('\n')                 #splits the data by the new line character

    game_map = []                           #creates game map data
    for row in data:
        game_map.append(list(row))          #ads each line in'map.txt'..
                                            #..data to new game map list
    return game_map

game_map = load_map('map')

grass_count = 0         #meant to be used to count each time a grass tile is blitted to.. 
                        #..move the position over 80 pixles for the next tile to be blited  
dirt_count = 0          # I think this might be where my problem is but I am not sure.


# Main loop

run = True
while run:
        
    for event in pygame.event.get():
            if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                    
    window.fill((135, 178,255))             #sets light Blue background color

    for layer in game_map:
                for tile in layer:                                            
                    if tile == '1':                                         #finds '1' in file,
                        dirt_count += 1                                     #updates dirt count,
                        window.blit(dirt_img, (100 * dirt_count + 80, 500))#blits next dirt tile
                    if tile == '2':                                         #finds '2' in file,
                        grass_count += 1                                   #updates grass count,
                        window.blit(grass_img, (100 * grass_count + 80, 500))#blits next tile
                                
                   
    clock.tick(60)

    pygame.display.update()

pygame.quit()
1

There are 1 answers

0
Rabbid76 On BEST ANSWER

The variable dirt_count and grass_count are incremented, but they are never changed back to 0. Set the variables to 0, right before the loop: grass_count = 0 grass_count = 0. Anyway, I don't think that this will satisfy you, since the coordinate of the tile doesn't seem to depend on it's index.

Most likely the position of the tile depends on the row an column:

for row, layer in enumerate(game_map):
    for column, tile in enumerate(layer):
        x, y = 80 + column * 100, 80 + row * 100
        if tile == '1':
            window.blit(dirt_img, (x, y))
        if tile == '2':
            window.blit(grass_img, (x, y))