Darbe Durdurması
Coddy'nin Pygame Journey'sinin Ses ve Oyun Hissi bölümünün bir parçası. Ders 14 / 23.
Büyük bir darbe, oyun saniyenin çok küçük bir bölümü boyunca durursa daha etkili olur. Dövüş ve aksiyon oyunları bunu sürekli yapar: güçlü bir darbede her şey birkaç kare boyunca donar, sonra devam eder. Buna darbe duraklaması denir.
Donmaya kalan kareleri saymak için bir sayaç daha kullan. Sayaç 0'dan büyük olduğu sürece değerini azalt ve güncellemenin tamamını atla. Çizim yapmaya devam et ki donmuş an ekranda kalsın:
if freeze > 0:
freeze -= 1
else:
enemy.x += enemy_speed
# ... güncellemenin geri kalanıSadece önemli darbelerde ayarla. Burada üçüncü darbe düşmanı yener, bu yüzden o darbede freeze = 12 ayarlanır; bu, saniyenin beşte biridir. Her küçük darbede oyunu dondurmak, oyunun güçlü değil, hantal hissettirmesine neden olur.
Flaş sayacı güncellemenin bir parçasıdır, bu yüzden o da bekler: düşman donma süresince bembeyaz kalır, patlama sesi çınlar ve ardından oyun devam eder. Donma sırasında olaylar yine de çalışır; dolayısıyla o sırada bir tuşa basan oyuncunun girdisi yok sayılmaz; burada Space yalnızca hp > 0 iken vurur.
Görev
OrtaDüşman sola ve sağa yürür; Space tuşuyla üç kez vurunca yenilir. Yenildiği darbede oyunu dondur:
- Döngüden önce
freeze = 0oluştur. - Vuruşun
hpdeğerini 0 yaptığı yerde,freeze = 12ayarla. - Güncelleme sırasında,
freeze0'dan büyük olduğu sürece değerini 1 azalt ve güncellemedeki diğer her şeyi atla. Çizimi olduğu gibi bırak.
Kendin dene
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Training Dummy")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)
hit_sound = pygame.mixer.Sound("assets/sounds/hit.ogg")
explosion_sound = pygame.mixer.Sound("assets/sounds/explosion.ogg")
enemy = pygame.Rect(100, 150, 60, 60)
enemy_speed = 2
hp = 3
flash = 0
defeated = 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 and hp > 0:
hp -= 1
flash = 6
if hp == 0:
explosion_sound.play()
else:
hit_sound.play()
enemy.x += enemy_speed
if enemy.left < 40 or enemy.right > 440:
enemy_speed = -enemy_speed
if flash > 0:
flash -= 1
if hp == 0:
defeated += 1
hp = 3
enemy.x = 100
screen.fill((30, 30, 46))
if flash > 0:
pygame.draw.rect(screen, (255, 255, 255), enemy)
else:
pygame.draw.rect(screen, (220, 80, 80), enemy)
label = font.render(f"HP: {hp} Defeated: {defeated}", True, (240, 240, 240))
screen.blit(label, (20, 20))
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