Можно ли снять изображение с экрана? - PullRequest
0 голосов
/ 04 апреля 2020

В моем сценарии у меня есть сердечные канистры, которые прилипают к экрану, и списки для сердечных канистр добавлены в список. Когда мой игрок ударяет по сердечной канистре, я хочу, чтобы сердечная канистра и прямоугольник исчезли. У меня все коллизии настроены так, что когда игрок бьет по сердцу, его прямоугольник удаляется из списка, но я не могу понять, как отсоединить / убрать сердечную канистру с экрана. Вот мой соответствующий код ...

def room_2(): #Only called once, when player enters room
    global tile_rects
    global heart_rects
    global halfheart_rects
    global r_x 
    global r_y
    global room
    room = room2
    tile_rects = []
    heart_rects = [] 
    halfheart_rects = [] #List for halfheart_rects being emptied
    screen.fill((0, 0, 255))
    r_y = 0
    for layer in room2: #Loop through an array, and translate numbers from the array to things                   on screen
        r_x = 0
        for tile in layer:  
            if tile == '4':
                screen.blit(floor_halfheart, (r_x*40- 8, r_y*40)) #Blit heart in location wanted
                halfheart_rects.append(pygame.Rect(r_x*40, r_y*40, 39, 39)) #Add rect to list
            if tile == '3':
                bat_create()
            if tile == '2':
                screen.blit(stone_block, (r_x*40, r_y*40))
                tile_rects.append(pygame.Rect(r_x*40, r_y*40, 40, 40))                     
            if tile == '1':
                screen.blit(stone_wall, (r_x*40, r_y*40))    
                tile_rects.append(pygame.Rect(r_x*40, r_y*40, 39, 39))
            r_x += 1
        r_y += 1 

for hh in halfheart_rects: #Loop through halfheart_rects list
    halfheart_collision = player_rect.colliderect(hh) #Collision between player and single heart
    if halfheart_collision:
        if player_health < player_health_max: 
            player_health += 1
            room[hh.y // 40][hh.x//40] = '0' #Removing heart canister number from array for when nect entering room
            halfheart_rects.remove(hh)

Я попытался накрыть место, где баллон с сердцем, цветным прямоугольником в if player_health < player_health_max:, но следующие строки запускаются только один раз, поэтому мигание прямоугольника затем исчезает , Заранее спасибо!

1 Ответ

0 голосов
/ 05 апреля 2020

Вам нужно превратить это в 2 функции, 1 для настройки всего и 1 для рисования, потому что вы должны бить сердечные канистры каждый кадр, а не один раз. Это означает, что вам не нужно снимать блики, вы можете просто не закрывать старый. Вы также можете переместить их в функцию, где вы рисуете игрока. Общая настройка должна выглядеть следующим образом:

def draw_screen():
    screen.fill((0, 0, 255))
    player.draw()
    for heart in halfheart_rects:
        screen.blit(floor_halfheart, (hear.x, heart.y)) 

def setup_room_2()
    global tile_rects
    global heart_rects
    global halfheart_rects
    global r_x 
    global r_y
    global room
    room = room2
    tile_rects = []
    heart_rects = [] 
    halfheart_rects = []
    screen.fill((0, 0, 255))
    r_y = 0
    for layer in room2:
        r_x = 0
        for tile in layer:  
            if tile == '4':
                halfheart_rects.append(pygame.Rect(r_x*40, r_y*40, 39, 39))
            if tile == '3':
                bat_create()
            if tile == '2':
                tile_rects.append(pygame.Rect(r_x*40, r_y*40, 40, 40))                     
            if tile == '1':    
                tile_rects.append(pygame.Rect(r_x*40, r_y*40, 39, 39))
            r_x += 1
        r_y += 1 


while running:
    draw_screen()
    if player_enters_room_1:
        setup_room_1()
    elif player_enters_room_2:
        setup_room_2()
for hh in halfheart_rects:
    halfheart_collision = player_rect.colliderect(hh)
    if halfheart_collision:
        if player_health < player_health_max: 
            player_health += 1
            room[hh.y // 40][hh.x//40] 
            halfheart_rects.remove(hh)

для l oop в конце плохо, так как при удалении одного из списка, скажем, его 2-го, 3-го становится 2-м, поэтому l oop пропускает его и переходит к 3-му (который был 4-м)

, если это не помогает, поместите код, где вы рисуете все, и я посмотрю.

...