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.
Wyzwanie
ŚredniSpraw, 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()
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
1Efekty dźwiękowe
Wczytywanie dźwiękuDźwięk w reakcji na zdarzenieGłośność dźwiękuDźwięki i przytrzymane klawisze4Wstrząs ekranu i błysk po trafieniu
Wstrząs ekranuBłysk po trafieniuPauza przy trafieniuNie przesadzajPoćwicz samodzielnie: Edytor online Pygame