Почему отображение pygame не отображается должным образом?

#python #python-3.x #pygame #pygame-surface

#python #python-3.x #pygame #pygame-поверхность

Вопрос:

Я пытаюсь создать 2d-платформер на основе плиток на Python с помощью Pygame. Я начал с простого создания системы окон и плиток. Он ссылается на текстовый файл и на основе каждого числа, найденного в файле, выводит изображение в окно отображения Pygame («2» для изображения травы, «1» для изображения грязи). Когда программа выполняется, плитки появляются на экране, но быстро мигают и медленно перемещаются в одну сторону. Между плитками также есть пробелы, и я не уверен, почему они там, но я хочу от них избавиться.

 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:

Переменная dirt_count и grass_count увеличивается, но они никогда не меняются обратно на 0. Установите для переменных значение 0 прямо перед циклом : grass_count = 0 grass_count = 0 . В любом случае, я не думаю, что это вас удовлетворит, поскольку координата плитки, похоже, не зависит от ее индекса.

Скорее всего, положение плитки зависит от row 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))