Здесь происходит то, что вы помещаете код для обновления позиции в цикл обработки событий, что означает, что ваш код для перемещения объекта запускается только тогда, когда pyame обнаруживает событие, подобное нажатию клавиши. Но если вы удерживаете нажатой клавишу, Pygame не регистрирует это как событие.
Просто удалите весь код из keys = pygame.key...
до display.update()
из цикла for и поместите его в цикл while.
Как таковой:
while run:
pygame.time.delay(100)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
x -= vel
if keys[pygame.K_RIGHT]:
x += vel
if keys[pygame.K_UP]:
y -= vel
if keys[pygame.K_DOWN]:
y += vel
win.fill((0,0,0))
pygame.draw.rect(win, (255,255,255), (x,y,width,height))
pygame.display.update()
pygame.quit()
Объект, который должен двигаться, теперь будет двигаться непрерывно, пока нажаты клавиши!