Menu
CoddyTech

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.

challenge icon

Görev

Orta

Düşman sola ve sağa yürür; Space tuşuyla üç kez vurunca yenilir. Yenildiği darbede oyunu dondur:

  1. Döngüden önce freeze = 0 oluştur.
  2. Vuruşun hp değerini 0 yaptığı yerde, freeze = 12 ayarla.
  3. Güncelleme sırasında, freeze 0'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

Kendi başına pratik yap: Pygame playground