Menu
CoddyTech

Jeda Benturan

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

Pukulan besar terasa lebih keras jika game berhenti selama sepersekian detik. Game pertarungan dan aksi sering melakukannya: saat terjadi pukulan kuat, semuanya membeku selama beberapa frame, lalu berjalan kembali. Ini disebut hit stop.

Gunakan counter lagi untuk menghitung sisa frame pembekuan. Selama nilainya di atas 0, kurangi nilainya dan lewati seluruh update. Tetap gambar layar agar momen yang membeku tetap terlihat:

if freeze > 0:
    freeze -= 1
else:
    enemy.x += enemy_speed
    # ... sisa pembaruan

Atur nilainya hanya untuk pukulan yang penting. Di sini pukulan ketiga mengalahkan musuh, jadi pukulan itu mengatur freeze = 12, seperlima detik. Membekukan game pada setiap pukulan kecil membuat game terasa tersendat, bukan kuat.

Counter kilatan adalah bagian dari update, jadi counter itu juga menunggu: musuh tetap putih selama pembekuan berlangsung, suara ledakan terus terdengar, lalu game berjalan kembali. Event tetap berjalan selama pembekuan, jadi pemain yang menekan tombol saat itu tidak diabaikan; di sini Space hanya menyerang saat hp > 0.

challenge icon

Tantangan

Sedang

Musuh bergerak ke kiri dan kanan. Tiga kali terkena serangan dengan Space akan mengalahkannya. Bekukan permainan saat serangan yang mengalahkannya terjadi:

  1. Buat freeze = 0 sebelum perulangan.
  2. Saat serangan membuat hp menjadi 0, tetapkan freeze = 12.
  3. Pada pembaruan, selama freeze lebih dari 0, kurangi nilainya sebanyak 1 dan lewati semua hal lainnya dalam pembaruan. Biarkan penggambarannya seperti semula.

Coba sendiri

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

Semua pelajaran di Suara dan Sensasi Bermain

Latihan sendiri: Playground Pygame