Menu
CoddyTech

Chớp sáng khi trúng đòn

Thuộc phần Âm thanh và cảm giác chơi trong hành trình Pygame của Coddy. Bài học 13 trên 23.

Khi bạn đánh trúng kẻ địch, trò chơi nên hiển thị hiệu ứng ngay lập tức, kể cả trước khi thanh máu thay đổi. Cách thường dùng là nháy sáng khi trúng đòn: trong vài khung hình, kẻ địch được vẽ toàn màu trắng.

Ta chỉ cần một bộ đếm số khung hình còn nháy sáng. Khi trúng đòn, đặt giá trị cho bộ đếm; mỗi khung hình giảm giá trị đó:

flash = 0
...
# trúng một đòn
hp -= 1
flash = 6
...
# mỗi khung hình
if flash > 0:
    flash -= 1

Khi vẽ, bộ đếm quyết định màu sắc:

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

Sáu khung hình tương đương một phần mười giây: đủ lâu để nhìn thấy, nhưng đủ ngắn để đòn đánh tiếp theo có thể làm kẻ địch nháy sáng lần nữa. Người chơi có thể nhận ra ngay đòn đánh đã trúng.

Sprite dùng hình ảnh cũng có thể nháy sáng theo cách tương tự: giữ một bản sao màu trắng của hình ảnh hoặc tô trắng một bản sao, rồi blit bản sao đó trong lúc bộ đếm còn chạy. Nhiều trò chơi làm nhân vật người chơi nháy đỏ khi họ chịu sát thương, cũng dùng bộ đếm như vậy.

challenge icon

Thử thách

Dễ

Khi bị đánh, hãy làm cho kẻ địch lóe sáng màu trắng.

  1. Đặt flash = 0 trước vòng lặp và đặt flash = 6 khi đánh trúng.
  2. Mỗi khung hình, giảm flash đi 1 khi giá trị này lớn hơn 0.
  3. Vẽ kẻ địch màu trắng (255, 255, 255) khi flash lớn hơn 0, nếu không thì vẽ màu đỏ.

Nhấn Chơi rồi nhấn phím cách: kẻ địch sẽ lóe sáng màu trắng. Sau đó nhấn Kiểm tra.

Tự làm thử

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()

Tất cả bài học trong Âm thanh và cảm giác chơi

Tự luyện tập: Playground Pygame