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 pembaruanAtur 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.
Tantangan
SedangMusuh bergerak ke kiri dan kanan. Tiga kali terkena serangan dengan Space akan mengalahkannya. Bekukan permainan saat serangan yang mengalahkannya terjadi:
- Buat
freeze = 0sebelum perulangan. - Saat serangan membuat
hpmenjadi 0, tetapkanfreeze = 12. - Pada pembaruan, selama
freezelebih 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
4Guncangan Layar dan Kilatan Saat Terkena Serangan
Guncangan LayarKilatan Saat Terkena SeranganJeda BenturanJangan BerlebihanLatihan sendiri: Playground Pygame