jacob starheim
jacob starheim

Reputation: 89

How can I make music play in the background of my py game?

import random

time = 120

WIDTH = 800
HEIGHT = 500

background = Actor("background")
player = Actor("player")
enemy = Actor("enemy")
money = Actor("money", pos=(300, 300))
player2 = Actor("alien")
score = 0
player.x = 200
player.y = 200
player2.x = 400
player2.y = 400

def draw():
    screen.clear()
    background.draw()
    player.draw()
    enemy.draw()
    money.draw()
    player2.draw()
    screen.draw.text("YFF-Spill score:", (200, 0), color="white")
    score_string = str(score)
    screen.draw.text(score_string, (327, 0), color="red")
    time_string = str(round(time))
    screen.draw.text(time_string, (50, 0), color="black")


def update(delta):
    global score, time
    time = time - delta
    if time <= 0:
        exit()
    if keyboard.right:
        player.x = player.x + 4
    if keyboard.left:
        player.x = player.x - 4
    if keyboard.down:
        player.y = player.y + 4
    if keyboard.up:
        player.y = player.y - 4
    if player.x > WIDTH:
        player.x = WIDTH
    if player.x < 0:
        player.x = 0
    if player.y < 0:
        player.y = 0
    if player.y > HEIGHT:
        player.y = HEIGHT
    if keyboard.d:
        player2.x = player2.x + 4
    if keyboard.a:
        player2.x = player2.x - 4
    if keyboard.s:
        player2.y = player2.y + 4
    if keyboard.w:
        player2.y = player2.y - 4
    if player.colliderect(player2):
        exit()
    if player2.x > WIDTH:
        player2.x = WIDTH
    if player2.x < 0:
        player2.x = 0
    if player2.y < 0:
        player2.y = 0
    if player2.y > HEIGHT:
        player2.y = HEIGHT
    dx1, dy1 = player.x - enemy.x, player.y - enemy.y
    dx2, dy2 = player2.x - enemy.x, player2.y - enemy.y
    dist1sq = dx1 * dx1 + dy1 * dy1
    dist2sq = dx2 * dx2 + dy2 * dy2

    player_near = player if dist1sq < dist2sq else player2

    if enemy.x < player_near.x:
        enemy.x += 1
    if enemy.x > player_near.x:
        enemy.x -= 1
    if enemy.y < player_near.y:
        enemy.y += 1
    if enemy.y > player_near.y:
        enemy.y -= 1
    if player.colliderect(enemy):
        exit()
    if player2.colliderect(enemy):
        exit()
    if money.colliderect(player):
        money.x = random.randint(0, WIDTH)
        money.y = random.randint(0, HEIGHT)
        score = score + 1
    if money.colliderect(player2):
        money.x = random.randint(0, WIDTH)
        money.y = random.randint(0, HEIGHT)
        score += 1
    if keyboard.d:
        player2.x = player2.x + 4
    if keyboard.a:
        player2.x = player2.x - 4
    if keyboard.s:
        player2.y = player2.y + 4
    if keyboard.w:
        player2.y = player2.y - 4
    if player.colliderect(player2):
        exit()
    if player2.x > WIDTH:
        player2.x = WIDTH
    if player2.x < 0:
        player2.x = 0
    if player2.y < 0:
        player2.y = 0
    if player2.y > HEIGHT:
        player2.y = HEIGHT

This is a pygame i made in mu editor, there are 2 players trying to evade the enemy and while they try to collect money. I want to add a song playing in the background of my pygame, how can I do this? I have tried to put a mp3 file in the music folder in mu editor but I am not sure what code to put in to make it play in the game.

Upvotes: 2

Views: 241

Answers (1)

Kingsley
Kingsley

Reputation: 14906

It's pretty easy to add music with PyGame's mixer functions. Use one channel for the music, and another for any sound effects. These become "mixed" together. One "gotcha" is that mixer doesn't like MP3 files, so you need to convert the sound to .OGG or another supported format (with something like Audacity). This is due to the MP3 format being patent encumbered (has this expired?).

Anyway, so the idea is to make two pygame.mixer.Channel, one for music, one for sounds.

pygame.mixer.init()

# create separate Channel objects for simultaneous playback
channel1 = pygame.mixer.Channel(0)        # argument must be int
channel2 = pygame.mixer.Channel(1)

# Load and play a continuously looping music
background_sound = pygame.mixer.Sound( 'background_music.ogg' )
channel1.play( background_sound, -1 )        # loop the music forever

So now the background music will loop forever on channel1.

To play separate event-based sounds, use channel2:

whack_sound = pygame.mixer.Sound( 'whack.ogg' )
bloop_sound = pygame.mixer.Sound( 'bloop-bloop.ogg' )

# In main loop
    [...]
    channel2.play( bloop_sound )

Upvotes: 1

Related Questions