Wstrząs ekranu
Część sekcji Dźwięk i odczucia z gry ścieżki Pygame w Coddy. Lekcja 12 z 23.
Ciężka skrzynia uderza o ziemię, a cały widok na chwilę podskakuje. To drganie ekranu: przez kilka klatek wszystko jest rysowane kilka pikseli dalej, za każdym razem w innym miejscu.
Aby przesunąć wszystko naraz, rysuj świat na osobnej powierzchni zamiast na ekranie, a następnie wyświetl tę powierzchnię na ekranie z przesunięciem:
world = pygame.Surface((480, 360))W pętli wywołania rysujące, które używały screen, teraz używają world. Następnie wybierz przesunięcie:
offset = (0, 0)
if shake > 0:
amount = shake // 3
offset = (random.randint(-amount, amount), random.randint(-amount, amount))
shake -= 1
screen.fill((0, 0, 0))
screen.blit(world, offset)shake zlicza pozostałe klatki drgania. Lądowanie ustawia tę wartość na 12. Ponieważ amount to shake // 3, w pierwszych klatkach przesunięcie wynosi do 4 pikseli, a potem 3, 2, 1 i zero: wstrząs stopniowo wygasa, zamiast urwać się nagle. Najpierw wypełnij ekran czernią, ponieważ świat przesunięty o 4 piksele pozostawia wąski pas bez pokrycia.
Wyzwanie
ŚredniSpacja upuszcza skrzynię, a jej lądowanie ustawia shake = 12, z którego nic jeszcze nie korzysta. Potrząśnij widokiem:
- Przed pętlą utwórz
world = pygame.Surface((480, 360)). - Narysuj tło, podłoże, słupek i skrzynie na
worldzamiast nascreen. - Gdy
shakejest większe od 0, wybierz przesunięcie za pomocąamount = shake // 3irandom.randint(-amount, amount)dla x i y, a następnie zmniejszshakeo 1. - Wypełnij ekran czernią i narysuj
worldz przesunięciem.
Spróbuj swoich sił
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Crate Drop")
clock = pygame.time.Clock()
thud_sound = pygame.mixer.Sound("assets/sounds/thud.ogg")
falling = []
landed = []
shake = 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 == pygame.K_SPACE:
falling.append(pygame.Rect(random.randint(140, 400), -40, 40, 40))
for crate in falling:
crate.y += 8
if crate.bottom >= 300:
crate.bottom = 300
landed.append(crate)
thud_sound.play()
shake = 12
falling = [crate for crate in falling if crate.bottom < 300]
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 80, 100), (0, 300, 480, 60))
pygame.draw.rect(screen, (80, 160, 255), (60, 220, 30, 80))
for crate in falling + landed:
pygame.draw.rect(screen, (170, 110, 60), crate)
pygame.display.flip()
clock.tick(60)
pygame.quit()
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