Une caméra fluide
Fait partie de la section Son et sensations de jeu du Journey Pygame de Coddy. Leçon 17 sur 23.
Dans ce jeu de course, la caméra est rivée au joueur : quoi qu’il fasse, il reste au centre de l’écran et le monde défile sous ses pieds. Ça fonctionne, mais chaque démarrage et chaque arrêt secoue toute l’image.
Fais suivre la caméra avec le même lissage que le cercle. Sa cible est la position qui centrerait le joueur :
camera_x += (player.centerx - 240 - camera_x) * 0.1
camera_x = max(0, min(camera_x, WORLD_WIDTH - 480))Le joueur se déplace comme avant ; seule la vue est lissée. Quand le joueur se met à courir, la caméra prend un peu de retard, si bien qu’il court en avant du centre. Quand il s’arrête, la caméra glisse pour le rattraper et se stabilise avec le joueur de nouveau au milieu. La deuxième ligne maintient toujours la caméra à l’intérieur du monde.
Le monde est dessiné à -int(camera_x) comme avant. camera_x est maintenant un nombre décimal ; int() maintient le dessin sur des pixels entiers, tandis que la variable conserve sa valeur exacte pour l’image suivante.
Un panneau de menu qui glisse à l’écran, une barre de vie qui se vide, un score qui augmente : tout ce qui évolue vers une nouvelle valeur peut être lissé de la même façon.
Défi
MoyenFais suivre la caméra en douceur : remplace camera_x = player.centerx - 240 par une ligne qui déplace camera_x d’un dixième de la distance vers player.centerx - 240 à chaque image. Garde la ligne qui la limite.
Essayez vous-même
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Long Road")
clock = pygame.time.Clock()
WORLD_WIDTH = 1440
player = pygame.Rect(220, 240, 40, 40)
camera_x = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player.x -= 6
if keys[pygame.K_RIGHT]:
player.x += 6
player.left = max(player.left, 0)
player.right = min(player.right, WORLD_WIDTH)
camera_x = player.centerx - 240
camera_x = max(0, min(camera_x, WORLD_WIDTH - 480))
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 80, 100), (0, 280, 480, 80))
for post_x in range(0, WORLD_WIDTH, 120):
pygame.draw.rect(screen, (80, 160, 255), (post_x - int(camera_x), 220, 20, 60))
pygame.draw.rect(screen, (90, 200, 120), player.move(-int(camera_x), 0))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
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