Вам нужно превратить это в 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-м)
, если это не помогает, поместите код, где вы рисуете все, и я посмотрю.