Menu
CoddyTech

Płynna kamera

Część sekcji Dźwięk i odczucia z gry ścieżki Pygame w Coddy. Lekcja 17 z 23.

W tej grze drogowej kamera jest przyklejona do gracza: cokolwiek robi gracz, pozostaje na środku ekranu, a świat przesuwa się pod nim. To działa, ale każde ruszenie i zatrzymanie szarpie całym widokiem.

Niech kamera podąża za graczem z takim samym wygładzaniem jak okrąg. Jej celem jest pozycja, która umieściłaby gracza na środku:

camera_x += (player.centerx - 240 - camera_x) * 0.1
camera_x = max(0, min(camera_x, WORLD_WIDTH - 480))

Gracz porusza się jak wcześniej; wygładza się tylko widok. Gdy gracz zaczyna biec, kamera nieco się opóźnia, więc gracz wyprzedza środek. Gdy się zatrzymuje, kamera płynnie dogania gracza i ponownie ustawia go na środku. Druga linia nadal utrzymuje kamerę w granicach świata.

Świat jest rysowany przy -int(camera_x), tak jak wcześniej. camera_x jest teraz liczbą dziesiętną; int() utrzymuje rysowanie na pełnych pikselach, a zmienna zachowuje dokładną wartość na następną klatkę.

Panel menu, który się wysuwa, pasek zdrowia, który się opróżnia, wynik, który rośnie: wszystko, co zmienia wartość, może być wygładzane w ten sam sposób.

challenge icon

Wyzwanie

Średni

Spraw, by kamera płynnie podążała za graczem: zastąp camera_x = player.centerx - 240 linią, która w każdej klatce przesuwa camera_x o jedną dziesiątą odległości w kierunku player.centerx - 240. Pozostaw linię, która ogranicza jej wartość.

Spróbuj swoich sił

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()
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Dźwięk i odczucia z gry

Poćwicz samodzielnie: Edytor online Pygame