Nie przesadzaj
Część sekcji Dźwięk i odczucia z gry ścieżki Pygame w Coddy. Lekcja 15 z 23.
Wyrazistość odczuć w grze to przyprawa. Lekkie potrząśnięcie sprawia, że lądowanie wydaje się ciężkie; zbyt mocne utrudnia śledzenie akcji i może powodować nudności u graczy. Dwie zasady pomagają zachować umiar.
Ustaw limit. Gdy efekty się kumulują, mogą rosnąć bez końca. Tutaj każde lądowanie dodaje 12 do shake; cztery skrzynie lądujące jednocześnie zwiększają tę wartość powyżej 40, a widok przeskakuje o 13 pikseli. min() ustawia górny limit:
shake = min(shake + 12, 18)Teraz potrząsanie trwa dłużej, jeśli skrzynie wciąż lądują, ale przesunięcie nigdy nie przekracza 18 // 3, czyli 6 pikseli.
Pozwól graczom je wyłączyć. Niektóre osoby nie mogą grać, gdy ekran się porusza. Ustawienie wymaga tylko jednej zmiennej:
shake_on = True
...
if shake_on:
offset = (random.randint(-amount, amount), random.randint(-amount, amount))Narysuj etykietę po wyświetleniu świata, bezpośrednio na ekranie. Tekst będący częścią interfejsu powinien pozostawać nieruchomy, gdy świat się trzęsie.
Wyzwanie
ŚredniSpacja upuszcza skrzynie, a każde lądowanie zwiększa wartość shake o 12. Zmniejsz ten efekt:
- Zmień obsługę lądowania tak, aby
shakenigdy nie przekraczało 18:shake = min(shake + 12, 18). - Przed pętlą ustaw
shake_on = True; klawisz S przełącza tę wartość. - Losuj przesunięcie tylko wtedy, gdy
shake_onma wartość true. - Po wyświetleniu świata narysuj na ekranie
Shake: OnlubShake: Offw pozycji(10, 10).
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()
font = pygame.font.Font(None, 28)
thud_sound = pygame.mixer.Sound("assets/sounds/thud.ogg")
falling = []
landed = []
shake = 0
world = pygame.Surface((480, 360))
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]
world.fill((30, 30, 46))
pygame.draw.rect(world, (80, 80, 100), (0, 300, 480, 60))
pygame.draw.rect(world, (80, 160, 255), (60, 220, 30, 80))
for crate in falling + landed:
pygame.draw.rect(world, (170, 110, 60), crate)
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)
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