Menu
CoddyTech

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.

challenge icon

Thử thách

Trung bình

Làm rung khung nhìn khi một chiếc thùng tiếp đất.

  1. Trước vòng lặp, tạo world = pygame.Surface((480, 360)).
  2. Đổi screen thành world trong năm dòng vẽ.
  3. Khi shake lớn hơn 0, chọn độ lệch x và y bằng amount = shake // 3 và random.randint(-amount, amount), sau đó giảm shake đi 1.
  4. Tô màn hình màu đen và blit world tạ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

Tự luyện tập: Playground Pygame