Suara dan Tombol yang Ditahan
Termasuk bagian Suara dan Sensasi Bermain dalam perjalanan Pygame di Coddy. Pelajaran 4 dari 23.
Tahan Space dan kapal menembakkan laser setiap 12 frame. Kode awal memutar suara laser seperti ini:
if keys[pygame.K_SPACE]:
laser_sound.play()
if cooldown == 0:
lasers.append(...)keys[pygame.K_SPACE] bernilai true di setiap frame saat tombol ditekan. Jadi, selama kamu menahan Space, suara mulai diputar 60 kali per detik, meskipun hanya 5 laser yang melesat. Kamu mendengar dengungan kasar, bukan suara tembakan.
Perbaikannya mengikuti aturan yang sama seperti sebelumnya: putar suara di tempat aksinya terjadi. Tembakan terjadi di dalam if cooldown == 0:, jadi suara ditempatkan di sana:
if keys[pygame.K_SPACE]:
if cooldown == 0:
lasers.append(...)
laser_sound.play()Sekarang setiap laser memiliki suaranya sendiri dan tidak ada yang lain yang memutarnya. Untuk aksi yang terjadi sekali setiap kali tombol ditekan, seperti melompat, putar suara di dalam event KEYDOWN: ada satu event untuk setiap tekanan, berapa pun lamanya tombol ditahan.
Tantangan
MudahTahan Space dan pesawat menembakkan laser setiap 12 frame, tetapi suaranya berdengung. Pindahkan laser_sound.play() agar suara diputar sekali untuk setiap laser yang ditembakkan: ke dalam cabang if cooldown == 0:, setelah laser ditambahkan.
Coba sendiri
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Lasers")
clock = pygame.time.Clock()
laser_sound = pygame.mixer.Sound("assets/sounds/laser.ogg")
laser_sound.set_volume(0.5)
ship = pygame.Rect(220, 300, 40, 30)
lasers = []
cooldown = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
ship.x -= 5
if keys[pygame.K_RIGHT]:
ship.x += 5
ship.clamp_ip(screen.get_rect())
if cooldown > 0:
cooldown -= 1
if keys[pygame.K_SPACE]:
laser_sound.play()
if cooldown == 0:
lasers.append(pygame.Rect(ship.centerx - 2, ship.top - 12, 4, 12))
cooldown = 12
for laser in lasers:
laser.y -= 8
lasers = [laser for laser in lasers if laser.bottom > 0]
screen.fill((30, 30, 46))
for laser in lasers:
pygame.draw.rect(screen, (255, 230, 90), laser)
pygame.draw.rect(screen, (80, 200, 230), ship)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Suara dan Sensasi Bermain
4Guncangan Layar dan Kilatan Saat Terkena Serangan
Guncangan LayarKilatan Saat Terkena SeranganJeda BenturanJangan BerlebihanLatihan sendiri: Playground Pygame