Se déplacer vers une cible
Fait partie de la section Son et sensations de jeu du Journey Pygame de Coddy. Leçon 16 sur 23.
Clique, et le cercle se téléporte à cet endroit. Un objet qui glisse pour se mettre en place est plus agréable à regarder : rapide au début, puis plus lent, jusqu’à se poser doucement à l’endroit voulu. Une seule ligne suffit. À chaque image, parcourez une fraction de la distance restante :
x += (target_x - x) * 0.1
y += (target_y - y) * 0.1target_x - x représente la distance qu’il reste à parcourir. En parcourir un dixième correspond à 20 pixels sur un trajet de 200 pixels lors de la première image. À l’image suivante, il reste 180 pixels, donc le cercle en parcourt 18, puis 16,2, et ainsi de suite. Les étapes raccourcissent à mesure que le cercle s’approche : il ralentit progressivement au lieu de s’arrêter net.
On appelle souvent cela lerp, abréviation de l’interpolation linéaire. La fraction détermine la sensation : 0.1 donne un mouvement fluide, 0.3 un mouvement vif, 0.02 un mouvement lent et léger. Le cercle n’atteint jamais exactement la cible, mais au bout d’une seconde, il en est à moins d’un pixel, ce que personne ne peut voir.
Conservez x et y sous forme de nombres décimaux dans leurs propres variables. Un Rect stocke des nombres entiers : un déplacement de 0.4 pixel serait arrondi à 0 et le mouvement s’arrêterait avant la cible.
Défi
FacileLe cercle saute à chaque clic. Fais-le glisser : remplace x = target_x et y = target_y par des lignes qui déplacent x et y d’un dixième du chemin vers la cible à chaque image.
Essayez vous-même
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()
Toutes les leçons de Son et sensations de jeu
4Tremblement de l’écran et flash d’impact
Tremblement de l’écranFlash d’impactArrêt sur impactRester subtil5Mouvement fluide
Se déplacer vers une cibleUne caméra fluideSauter lors du ramassageUne animation fluide à toute fréquence d’imagesEntraînez-vous par vous-même : Playground Pygame