Menu
CoddyTech

Guncangan Layar

Termasuk bagian Suara dan Sensasi Bermain dalam perjalanan Pygame di Coddy. Pelajaran 12 dari 23.

Sebuah peti berat menghantam tanah dan seluruh tampilan tersentak sesaat. Itulah guncangan layar: selama beberapa frame, semuanya digambar bergeser beberapa piksel, dengan arah yang berbeda pada setiap frame.

Untuk menggerakkan semuanya sekaligus, gambar dunia pada Surface tersendiri, bukan pada layar, lalu blit Surface tersebut ke layar dengan offset:

world = pygame.Surface((480, 360))

Di dalam perulangan, pemanggilan gambar yang menggunakan screen sekarang menggunakan world. Lalu tentukan offset:

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 menghitung sisa frame guncangan. Saat mendarat, nilainya diatur menjadi 12. Karena amount adalah shake // 3, pada frame awal objek bergerak hingga 4 piksel, lalu 3, 2, 1, dan tidak bergerak: guncangannya mereda, bukan berhenti mendadak. Isi layar dengan warna hitam terlebih dahulu, karena dunia yang bergeser 4 piksel akan menyisakan jalur tipis yang tidak tertutup.

challenge icon

Tantangan

Sedang

Tombol Spasi menjatuhkan peti, dan saat peti mendarat, shake = 12 disetel, tetapi belum ada yang menggunakannya. Goyangkan tampilan:

  1. Sebelum perulangan, buat world = pygame.Surface((480, 360)).
  2. Gambar latar belakang, tanah, tiang, dan peti pada world, bukan pada screen.
  3. Selama shake lebih besar dari 0, tentukan offset dengan amount = shake // 3 dan random.randint(-amount, amount) untuk x dan y, lalu kurangi shake sebanyak 1.
  4. Isi layar dengan warna hitam dan blit world pada offset tersebut.

Coba sendiri

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

Semua pelajaran di Suara dan Sensasi Bermain

Latihan sendiri: Playground Pygame