الأصوات والمفاتيح المضغوطة
جزء من قسم الصوت وإحساس اللعب في رحلة Pygame على Coddy. الدرس 4 من 23.
اضغط باستمرار على مفتاح المسافة، وستطلق السفينة شعاع ليزر كل 12 إطارًا. يشغّل البرنامج الصوتي المبدئي صوت الليزر بهذه الطريقة:
if keys[pygame.K_SPACE]:
laser_sound.play()
if cooldown == 0:
lasers.append(...)تكون قيمة keys[pygame.K_SPACE] صحيحة في كل إطار يكون فيه المفتاح مضغوطًا. لذلك، ما دمت تضغط على مفتاح المسافة باستمرار، يبدأ الصوت 60 مرة في الثانية، رغم أن 5 أشعة ليزر فقط تنطلق. ستسمع أزيزًا مزعجًا بدلًا من أصوات الطلقات.
الحل هو تطبيق القاعدة نفسها كما في السابق: شغّل الصوت عند حدوث الفعل. تحدث الطلقة داخل if cooldown == 0:، لذا ضع تشغيل الصوت هناك:
if keys[pygame.K_SPACE]:
if cooldown == 0:
lasers.append(...)
laser_sound.play()الآن يصاحب كل شعاع ليزر صوته، ولا يصدر أي صوت آخر. أما بالنسبة إلى فعل يحدث مرة واحدة عند كل ضغطة، مثل القفز، فشغّل الصوت داخل حدث KEYDOWN بدلًا من ذلك: إذ يقع حدث واحد لكل ضغطة، مهما طالت مدة إبقاء المفتاح مضغوطًا.
التحدي
سهلاضغط باستمرار على مفتاح المسافة، وستطلق السفينة شعاعًا ليزريًا كل 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()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الصوت وإحساس اللعب
تدرّب بنفسك: Playground لـ Pygame