إيقاف الموسيقى مؤقتًا
جزء من قسم الصوت وإحساس اللعب في رحلة Pygame على Coddy. الدرس 7 من 23.
عندما تتوقف اللعبة مؤقتًا، ينبغي أن تتوقف الموسيقى معها، وأن تتابع من الموضع نفسه عند استئناف اللعب. يوفّر مشغّل الموسيقى استدعاءين لذلك:
pygame.mixer.music.pause()
pygame.mixer.music.unpause()يُبقي pause() المقطوعة عند موضعها الحالي. ويتابع unpause() منها. لا تستخدم stop() وplay() لهذا الغرض: يبدأ play() المقطوعة من بدايتها مجددًا، فيسمع اللاعب الموازير الأولى في كل مرة يوقفها مؤقتًا.
استدعِهما عند تغيّر حالة الإيقاف المؤقت، حيث يبدّل P قيمة paused:
paused = not paused
if paused:
pygame.mixer.music.pause()
else:
pygame.mixer.music.unpause()تكتمل المؤثرات الصوتية التي تكون قيد التشغيل عند إيقاف اللعبة مؤقتًا من تلقاء نفسها؛ فهي قصيرة. ولا تبدأ اللعبة المتوقفة مؤقتًا أي مؤثرات جديدة، لأن الشيفرة التي تشغّلها لا تُنفّذ.
التحدي
متوسطيوقف الضغط على P اللعبة مؤقتًا ويعرض Paused. اجعل الموسيقى تتبع ذلك:
- عند إيقاف اللعبة مؤقتًا بالضغط على P، استدعِ
pygame.mixer.music.pause(). - عند استئناف اللعبة بالضغط على P، استدعِ
pygame.mixer.music.unpause().
جرّب بنفسك
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Lava Run")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)
def play_music(path, loops=-1):
pygame.mixer.music.load(path)
pygame.mixer.music.play(loops)
play_music("assets/music/theme.ogg")
player = pygame.Rect(40, 160, 30, 30)
goal = pygame.Rect(420, 160, 30, 30)
lava = pygame.Rect(0, 320, 480, 40)
state = "menu"
paused = False
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key == pygame.K_p:
if state == "play":
paused = not paused
elif event.type == pygame.KEYDOWN and event.key == pygame.K_RETURN:
if state == "menu":
state = "play"
play_music("assets/music/level.ogg")
player.topleft = (40, 160)
elif state in ("win", "lose"):
state = "menu"
play_music("assets/music/theme.ogg")
if state == "play" and not paused:
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player.x -= 4
if keys[pygame.K_RIGHT]:
player.x += 4
if keys[pygame.K_UP]:
player.y -= 4
if keys[pygame.K_DOWN]:
player.y += 4
player.clamp_ip(screen.get_rect())
if player.colliderect(goal):
state = "win"
play_music("assets/music/win.ogg", 0)
elif player.colliderect(lava):
state = "lose"
play_music("assets/music/lose.ogg", 0)
screen.fill((30, 30, 46))
if state == "menu":
title = font.render("Press Enter to start", True, (240, 240, 240))
screen.blit(title, title.get_rect(center=(240, 180)))
else:
pygame.draw.rect(screen, (230, 90, 40), lava)
pygame.draw.rect(screen, (90, 200, 120), goal)
pygame.draw.rect(screen, (80, 160, 255), player)
if state == "win":
message = font.render("You win!", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 100)))
elif state == "lose":
message = font.render("Game over", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 100)))
elif paused:
message = font.render("Paused", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 100)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الصوت وإحساس اللعب
تدرّب بنفسك: Playground لـ Pygame