Mova-se em Direção a um Alvo
Parte da seção Som e sensação de jogo do Journey de Pygame da Coddy. Lição 16 de 23.
Ao clicar, o círculo se teletransporta para lá. Algo que desliza até o lugar fica melhor: rápido no início, depois mais devagar, acomodando-se suavemente no lugar. Uma linha faz isso. A cada quadro, mova uma fração da distância que falta:
x += (target_x - x) * 0.1
y += (target_y - y) * 0.1target_x - x é a distância que falta percorrer. Mover um décimo dela cobre 20 pixels de um percurso de 200 pixels no primeiro quadro. No quadro seguinte, faltam 180 pixels, então ele se move 18, depois 16.2, e assim por diante. Os passos diminuem à medida que o círculo se aproxima: ele desacelera suavemente em vez de parar de repente.
Isso costuma ser chamado de lerp, abreviação de interpolação linear. A fração define a sensação: 0.1 é suave, 0.3 é ágil, 0.02 é lento e leve. Ele nunca chega exatamente ao alvo, mas, depois de um segundo, fica a menos de um pixel de distância, o que ninguém consegue ver.
Mantenha x e y como números decimais em variáveis próprias. Um Rect armazena números inteiros, então um passo de 0.4 pixels seria arredondado para 0 e o movimento pararia antes de chegar ao alvo.
Desafio
FácilO círculo salta para cada clique. Faça-o deslizar: substitua x = target_x e y = target_y por linhas que movam x e y um décimo do caminho até o alvo a cada quadro.
Experimente você mesmo
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Follow the Click")
clock = pygame.time.Clock()
x, y = 240, 180
target_x, target_y = 240, 180
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
target_x, target_y = event.pos
x = target_x
y = target_y
screen.fill((30, 30, 46))
pygame.draw.line(screen, (90, 90, 110), (target_x - 8, target_y), (target_x + 8, target_y), 2)
pygame.draw.line(screen, (90, 90, 110), (target_x, target_y - 8), (target_x, target_y + 8), 2)
pygame.draw.circle(screen, (80, 200, 220), (x, y), 12)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Todas as lições de Som e sensação de jogo
4Vibração da Tela e Flash de Impacto
Vibração da TelaFlash de ImpactoPausa no ImpactoMantenha a Discrição5Movimento Suave
Mova-se em Direção a um AlvoUma Câmera SuaveSalto ao ColetarSuave em Qualquer Taxa de QuadrosPratique por conta própria: Playground de Pygame