Menu
CoddyTech

צלילים ומקשים לחוצים

חלק מהיחידה צליל ותחושת משחק במסלול ה-Pygame של Coddy. שיעור 4 מתוך 23.

החזק את מקש הרווח והחללית יורה לייזר בכל 12 פריימים. קוד הפתיחה מפעיל את צליל הלייזר כך:

if keys[pygame.K_SPACE]:
    laser_sound.play()
    if cooldown == 0:
        lasers.append(...)

keys[pygame.K_SPACE] הוא true בכל פריים שבו המקש לחוץ. לכן, כל עוד מחזיקים את מקש הרווח, הצליל מתחיל 60 פעמים בשנייה, אף שרק 5 לייזרים נורים. שומעים זמזום צורם במקום יריות.

התיקון הוא אותו כלל כמו קודם: מפעילים את הצליל במקום שבו הדבר מתרחש. ירייה מתרחשת בתוך if cooldown == 0:, לכן הצליל מופעל שם:

if keys[pygame.K_SPACE]:
    if cooldown == 0:
        lasers.append(...)
        laser_sound.play()

עכשיו לכל לייזר יש צליל משלו, ושום דבר אחר לא מפעיל אותו. עבור פעולה שמתרחשת פעם אחת בכל לחיצה, כמו קפיצה, הפעילו את הצליל באירוע KEYDOWN: יש אירוע אחד לכל לחיצה, בלי קשר למשך הזמן שהמקש נשאר לחוץ.

challenge icon

אתגר

קל

החזק את מקש הרווח, והחללית יורה לייזר בכל 12 פריימים, אבל הצליל מזמזם. העבר את laser_sound.play() כך שיופעל פעם אחת עבור כל לייזר שנורה: לתוך ענף ה־if cooldown == 0:, אחרי הוספת הלייזר.

נסו בעצמכם

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 iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה צליל ותחושת משחק

תרגלו בעצמכם: Pygame אונליין