Rung màn hình
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 12 trên 23.
Một chiếc thùng nặng đập xuống đất, khiến toàn bộ khung hình rung lên trong thoáng chốc. Đó là rung màn hình: trong vài khung hình, mọi thứ được vẽ lệch đi vài pixel, theo một hướng khác nhau ở mỗi khung hình.
Để di chuyển mọi thứ cùng lúc, hãy vẽ thế giới lên một Surface riêng thay vì vẽ lên màn hình, rồi blit Surface đó lên màn hình với một độ lệch:
world = pygame.Surface((480, 360))Trong vòng lặp, các lệnh vẽ vốn dùng screen giờ dùng world. Sau đó chọn độ lệch:
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)shake đếm số khung hình còn lại để rung. Khi tiếp đất, hãy đặt giá trị này thành 12. Vì amount là shake // 3, những khung hình đầu tiên sẽ dịch chuyển tối đa 4 pixel, sau đó là 3, 2, 1 rồi không pixel nào: cú rung dịu dần thay vì dừng đột ngột. Trước tiên, hãy tô màn hình màu đen, vì khi dịch chuyển thế giới 4 pixel sẽ để lộ một dải mỏng chưa được phủ kín.
Thử thách
Trung bìnhLàm rung khung nhìn khi một chiếc thùng tiếp đất.
- Trước vòng lặp, tạo
world = pygame.Surface((480, 360)). - Đổi
screenthànhworldtrong năm dòng vẽ. - Khi
shakelớn hơn 0, chọn độ lệch x và y bằngamount = shake // 3vàrandom.randint(-amount, amount), sau đó giảmshakeđi 1. - Tô màn hình màu đen và blit
worldtại vị trí lệch.
Nhấn Chơi rồi nhấn Space: khung nhìn rung khi thùng tiếp đất. Sau đó nhấn Kiểm tra.
Tự làm thử
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Crate Drop")
clock = pygame.time.Clock()
thud_sound = pygame.mixer.Sound("assets/sounds/thud.ogg")
falling = []
landed = []
shake = 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:
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]
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 80, 100), (0, 300, 480, 60))
pygame.draw.rect(screen, (80, 160, 255), (60, 220, 30, 80))
for crate in falling + landed:
pygame.draw.rect(screen, (170, 110, 60), crate)
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