Menu
CoddyTech

Un décalage de caméra

Fait partie de la section Les mondes du Journey Pygame de Coddy. Leçon 20 sur 35.

Ce niveau mesure 48 tuiles de large, soit trois fenêtres. Tout conserve sa position dans le niveau, et une caméra détermine quelle partie du niveau la fenêtre affiche. La caméra est un nombre, camera_x : la coordonnée x du niveau au bord gauche de la fenêtre.

Pour dessiner quelque chose, soustrayez la caméra de sa coordonnée x dans le niveau :

for wall in walls:
    screen.blit(block_img, (wall.x - camera_x, wall.y))
screen.blit(player_img, (player.x - camera_x, player.y))

Avec camera_x = 0, vous voyez le début. Avec camera_x = 600, un mur à la coordonnée x = 800 est dessiné à la coordonnée 200. Seul l’affichage change : les Rects dans walls et player conservent leurs positions dans le niveau, donc les collisions fonctionnent comme avant.

Dans ce programme, la caméra dérive toute seule vers la droite, de 2 pixels par image, jusqu’à afficher la fin du niveau. Le programme de départ déplace camera_x mais dessine sans en tenir compte, donc rien ne bouge.

challenge icon

Défi

Facile
  1. Dessine chaque mur à (wall.x - camera_x, wall.y).
  2. Dessine le joueur à (player.x - camera_x, player.y).

Laisse le défilement tel quel : le niveau doit défiler vers la gauche tout seul.

Essayez vous-même

import pygame

TILE = 36
WIDTH = 576
SPEED = 4
GRAVITY = 1
JUMP = -15
MAX_FALL = 12

LEVEL = [
    "................................................",
    "................................................",
    "#...........###..........####..........###.....#",
    "#..............................................#",
    "#.....####.........###.........###.............#",
    "#..............................................#",
    "#.P........#####.........######.........####...#",
    "#..............................................#",
    "#..............................................#",
    "################################################",
]

pygame.init()
screen = pygame.display.set_mode((WIDTH, 360))
pygame.display.set_caption("Camera")
clock = pygame.time.Clock()

block_img = pygame.image.load("assets/images/block.png").convert_alpha()
player_img = pygame.image.load("assets/images/player.png").convert_alpha()

walls = []
for row, line in enumerate(LEVEL):
    for col, char in enumerate(line):
        if char == "#":
            walls.append(pygame.Rect(col * TILE, row * TILE, TILE, TILE))
        elif char == "P":
            start = (col * TILE + TILE // 2, row * TILE + TILE)

level_width = len(LEVEL[0]) * TILE
player = player_img.get_rect(midbottom=start)
vel_y = 0
on_ground = False
camera_x = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
            if on_ground:
                vel_y = JUMP
        elif event.type == pygame.KEYUP and event.key in (pygame.K_SPACE, pygame.K_UP):
            if vel_y < -4:
                vel_y = -4

    keys = pygame.key.get_pressed()
    dx = 0
    if keys[pygame.K_LEFT]:
        dx -= SPEED
    if keys[pygame.K_RIGHT]:
        dx += SPEED

    player.x += dx
    for wall in walls:
        if player.colliderect(wall):
            if dx > 0:
                player.right = wall.left
            elif dx < 0:
                player.left = wall.right

    vel_y = min(vel_y + GRAVITY, MAX_FALL)
    player.y += vel_y
    on_ground = False
    for wall in walls:
        if player.colliderect(wall):
            if vel_y > 0:
                player.bottom = wall.top
                on_ground = True
            elif vel_y < 0:
                player.top = wall.bottom
            vel_y = 0

    if camera_x < level_width - WIDTH:
        camera_x += 2

    screen.fill((140, 200, 240))
    for wall in walls:
        screen.blit(block_img, (wall.x, wall.y))
    screen.blit(player_img, (player.x, player.y))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Les mondes

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