Sesler ve Basılı Tutulan Tuşlar
Coddy'nin Pygame Journey'sinin Ses ve Oyun Hissi bölümünün bir parçası. Ders 4 / 23.
Boşluk tuşunu basılı tutun; gemi her 12 karede bir lazer ateşler. Başlangıç kodunda lazer sesi şöyle çalınır:
if keys[pygame.K_SPACE]:
laser_sound.play()
if cooldown == 0:
lasers.append(...)keys[pygame.K_SPACE], tuşun basılı olduğu her karede doğrudur. Bu yüzden Boşluk tuşunu basılı tuttuğunuzda ses saniyede 60 kez başlar, ancak yalnızca 5 lazer ateşlenir. Atış sesleri yerine boğuk bir vızıltı duyarsınız.
Çözüm, öncekiyle aynı kuraldır: sesi, eylemin gerçekleştiği yerde çalın. Atış if cooldown == 0: içinde gerçekleşir, dolayısıyla ses de oraya eklenir:
if keys[pygame.K_SPACE]:
if cooldown == 0:
lasers.append(...)
laser_sound.play()Artık her lazerin kendi sesi vardır ve başka hiçbir şey ses çıkarmaz. Zıplama gibi her basışta bir kez gerçekleşen bir eylem için sesi bunun yerine KEYDOWN etkinliğinde çalın: tuş ne kadar süre basılı kalırsa kalsın, her basışta bir etkinlik oluşur.
Görev
KolayBoşluk tuşuna basılı tutunca gemi her 12 karede bir lazer ateş ediyor, ancak ses vızıldıyor. laser_sound.play() kodunu, ateşlenen her lazer için bir kez çalacak şekilde taşı: lazer eklendikten sonra, if cooldown == 0: dalının içine.
Kendin dene
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()
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
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