Ekran Sarsıntısı
Coddy'nin Pygame Journey'sinin Ses ve Oyun Hissi bölümünün bir parçası. Ders 12 / 23.
Ağır bir sandık yere çarpar ve tüm görüntü bir anlığına sarsılır. İşte buna ekran sarsıntısı denir: birkaç kare boyunca her şey, her karede farklı bir yönde, birkaç piksel kaymış olarak çizilir.
Her şeyi aynı anda hareket ettirmek için dünyayı ekrana değil, ayrı bir Surface üzerine çiz; ardından bu Surface’i ekrana bir kaydırma miktarıyla blit et:
world = pygame.Surface((480, 360))Döngüde, daha önce screen kullanan çizim çağrılarında artık world kullan. Ardından kaydırma miktarını belirle:
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, sarsıntının süreceği kare sayısını tutar. Yere iniş, bu değeri 12 olarak ayarlar. amount değeri shake // 3 olduğundan ilk karelerde görüntü en fazla 4 piksel hareket eder, ardından bu miktar 3, 2, 1 ve sıfıra iner: sarsıntı bir anda kesilmek yerine giderek azalır. Ekranı önce siyaha boya; çünkü 4 piksel hareket ettirilen bir dünya, ince bir şeridi açıkta bırakır.
Görev
OrtaBoşluk tuşu bir sandık düşürür ve sandığın yere inmesi shake = 12 değerini ayarlar; bu değer henüz hiçbir yerde kullanılmıyor. Görüntüyü salla:
- Döngüden önce
world = pygame.Surface((480, 360))oluştur. - Arka planı, zemini, direği ve sandıkları
screenyerineworldüzerine çiz. shake0'dan büyükken, x ve y içinamount = shake // 3verandom.randint(-amount, amount)kullanarak bir kaydırma miktarı belirle, ardındanshakedeğerini 1 azalt.- Ekranı siyahla doldur ve
worldyüzeyini kaydırma miktarına göre blit et.
Kendin dene
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()
Ses ve Oyun Hissi bölümündeki tüm dersler
4Ekran Sarsıntısı ve Darbe Parlaması
Ekran SarsıntısıDarbe ParlamasıDarbe DurdurmasıAbartıdan Kaçının6Yıldız Devriyesini Geliştir
Yıldız Devriyesi SesleriHer Vuruşta KıvılcımlarKendi başına pratik yap: Pygame playground