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.
Tantangan
SedangTombol Spasi menjatuhkan peti, dan saat peti mendarat, shake = 12 disetel, tetapi belum ada yang menggunakannya. Goyangkan tampilan:
- Sebelum perulangan, buat
world = pygame.Surface((480, 360)). - Gambar latar belakang, tanah, tiang, dan peti pada
world, bukan padascreen. - Selama
shakelebih besar dari 0, tentukan offset denganamount = shake // 3danrandom.randint(-amount, amount)untuk x dan y, lalu kurangishakesebanyak 1. - Isi layar dengan warna hitam dan blit
worldpada 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
4Guncangan Layar dan Kilatan Saat Terkena Serangan
Guncangan LayarKilatan Saat Terkena SeranganJeda BenturanJangan BerlebihanLatihan sendiri: Playground Pygame