Menu
CoddyTech

Błysk po trafieniu

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

Gdy trafisz wroga, gra powinna od razu to pokazać, nawet zanim zmieni się pasek zdrowia. Zwykle stosuje się błysk po trafieniu: przez kilka klatek wróg jest rysowany całkowicie na biało.

Potrzebny jest jeden licznik — liczba klatek pozostałych do końca błysku. Trafienie ustawia jego wartość; w każdej klatce jest ona zmniejszana:

flash = 0
...
# trafienie
hp -= 1
flash = 6
...
# każda klatka
if flash > 0:
    flash -= 1

Podczas rysowania licznik wskazuje kolor:

if flash > 0:
    pygame.draw.rect(screen, (255, 255, 255), enemy)
else:
    pygame.draw.rect(screen, (220, 80, 80), enemy)

Sześć klatek to jedna dziesiąta sekundy: wystarczająco długo, by zauważyć błysk, ale na tyle krótko, by przy kolejnym trafieniu mógł pojawić się ponownie. Gracz od razu widzi, że atak trafił.

Duszek z obrazem może błyskać w ten sam sposób: zachowaj jego białą kopię obrazu albo wypełnij kopię bielą i wyświetlaj ją, gdy licznik jest aktywny. Wiele gier sprawia, że gracz miga na czerwono po otrzymaniu obrażeń, używając tego samego licznika.

challenge icon

Wyzwanie

Łatwy

Spacja trafia czerwonego przeciwnika i zmniejsza jego HP. Spraw, aby po każdym trafieniu migał:

  1. Przed pętlą ustaw flash = 0.
  2. Po trafieniu ustaw flash = 6.
  3. W każdej klatce zmniejszaj flash o 1, gdy jest większe od 0.
  4. Rysuj przeciwnika na biało (255, 255, 255), gdy flash jest większe od 0, a w przeciwnym razie na czerwono.

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")
player = pygame.Rect(120, 150, 60, 60)
enemy = pygame.Rect(300, 150, 60, 60)
hp = 5

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
            hit_sound.play()

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), player)
    if hp > 0:
        pygame.draw.rect(screen, (220, 80, 80), enemy)
    label = font.render(f"Enemy HP: {hp}", True, (240, 240, 240))
    screen.blit(label, (300, 110))
    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