Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Boş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()
quiz iconKendini test et

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

Kendi başına pratik yap: Pygame playground