Menu
CoddyTech

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.1

target_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.

challenge icon

Défi

Facile

Le 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

Entraînez-vous par vous-même : Playground Pygame