Как сделать чтобы функция в которой есть задержка не останавливала выполнение всего кода?
Задержек быть не должно. Чтобы выполнять некоторый код с какой-то периодичностью, надо генерировать события с этой периодичностью и обрабатывать их:import pygame

screen = pygame.display.set_mode((300, 200))
clock = pygame.time.Clock()
pygame.display.set_caption('Timer demo')

MOVE_DOWN_DELAY = 500
MOVE_DOWN_EVENT = pygame.USEREVENT + 1

pygame.time.set_timer(MOVE_DOWN_EVENT, MOVE_DOWN_DELAY)

dot = pygame.Rect(150, 10, 10, 10)

while True:
    clock.tick(50)

    if pygame.event.get(pygame.QUIT): break

    for e in pygame.event.get():
        if e.type == MOVE_DOWN_EVENT:
            dot.move_ip(0, 10)

    screen.fill((0, 0, 0))
    pygame.draw.rect(screen, (150, 150, 150), dot)
    pygame.display.flip()
Нужны потоки