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 -= 1Khi 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.
Thử thách
DễKhi bị đánh, hãy làm cho kẻ địch lóe sáng màu trắng.
- Đặt
flash = 0trước vòng lặp và đặtflash = 6khi đánh trúng. - Mỗi khung hình, giảm
flashđi 1 khi giá trị này lớn hơn 0. - Vẽ kẻ địch màu trắng
(255, 255, 255)khiflashlớ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
4Rung màn hình và chớp sáng khi trúng đòn
Rung màn hìnhChớp sáng khi trúng đònKhựng hình khi trúng đònGiữ hiệu ứng tinh tếTự luyện tập: Playground Pygame