Pauza przy trafieniu
Część sekcji Dźwięk i odczucia z gry ścieżki Pygame w Coddy. Lekcja 14 z 23.
Mocne trafienie jest bardziej odczuwalne, jeśli gra zatrzymuje się na ułamek sekundy. Gry walki i akcji robią tak cały czas: przy silnym ciosie wszystko zastyga na kilka klatek, a potem gra toczy się dalej. Nazywa się to zatrzymaniem po trafieniu.
Ponownie użyj licznika określającego liczbę klatek pozostałych do końca zatrzymania. Gdy jego wartość jest większa od 0, zmniejszaj go i pomijaj całą aktualizację. Nadal rysuj obraz, aby zamrożony moment pozostał na ekranie:
if freeze > 0:
freeze -= 1
else:
enemy.x += enemy_speed
# ... pozostała część aktualizacjiUstawiaj go tylko przy istotnych trafieniach. Tutaj trzecie trafienie pokonuje przeciwnika, więc wtedy licznik przyjmuje wartość freeze = 12, czyli jedną piątą sekundy. Zatrzymywanie gry po każdym drobnym trafieniu sprawia, że rozgrywka wydaje się ociężała, zamiast dawać poczucie siły.
Licznik błysku jest częścią aktualizacji, więc on również czeka: przeciwnik pozostaje biały przez cały czas zatrzymania, rozlega się dźwięk eksplozji, a potem gra toczy się dalej. Zdarzenia nadal są obsługiwane podczas zatrzymania, więc naciśnięcie wtedy klawisza przez gracza nie zostanie zignorowane; tutaj Spacja powoduje trafienie tylko wtedy, gdy hp > 0.
Wyzwanie
ŚredniWróg porusza się w lewo i w prawo; trzy trafienia klawiszem spacji go pokonują. Zatrzymaj grę po trafieniu, które go pokonuje:
- Ustaw
freeze = 0przed pętlą. - W miejscu, w którym trafienie obniża
hpdo 0, ustawfreeze = 12. - W aktualizacji, gdy
freezejest większe od 0, zmniejsz je o 1 i pomiń całą resztę aktualizacji. Pozostaw rysowanie bez zmian.
Spróbuj swoich sił
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Training Dummy")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)
hit_sound = pygame.mixer.Sound("assets/sounds/hit.ogg")
explosion_sound = pygame.mixer.Sound("assets/sounds/explosion.ogg")
enemy = pygame.Rect(100, 150, 60, 60)
enemy_speed = 2
hp = 3
flash = 0
defeated = 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 and hp > 0:
hp -= 1
flash = 6
if hp == 0:
explosion_sound.play()
else:
hit_sound.play()
enemy.x += enemy_speed
if enemy.left < 40 or enemy.right > 440:
enemy_speed = -enemy_speed
if flash > 0:
flash -= 1
if hp == 0:
defeated += 1
hp = 3
enemy.x = 100
screen.fill((30, 30, 46))
if flash > 0:
pygame.draw.rect(screen, (255, 255, 255), enemy)
else:
pygame.draw.rect(screen, (220, 80, 80), enemy)
label = font.render(f"HP: {hp} Defeated: {defeated}", True, (240, 240, 240))
screen.blit(label, (20, 20))
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