0

When I attempt to play a sound, it stops my whole project from running to play it. Any way I can play a sound without freezing everything. Is there a playsound function that doesnt freeze the program?

`import turtle as trtl
import keyboard as key
import random as rand
import playsound as sound
#screen will only update when told to.
space = trtl.Screen()
space.tracer(0, None)
space.screensize()
space.setup(width = 1.0, height = 1.0)
space.bgcolor("black")
canvas = trtl.getcanvas()
#define the player turtle
player=trtl.Turtle()
player.penup()
player.goto(0, 0)
player.shapesize(4,6,5)
player.color("darkblue", "blue")
# Variables for easy control
SPEED = 10
DELAY = 5
LASERLIFE = 90
LASERSPEED = 20
MAXHEALTH = 2
# Storage lists and other variables
lasers = []
enemies = []
nextattack=DELAY
# define some functions

def move(invert):
  if key.is_pressed("W"):
    player.setheading(90)
    player.forward(SPEED*invert)
  if key.is_pressed("S"):
    player.setheading(-90)
    player.forward(SPEED*invert)
  if key.is_pressed("A"):
    player.setheading(180)
    player.forward(SPEED*invert)
  if key.is_pressed("D"):
    player.setheading(0)
    player.forward(SPEED*invert)
  if abs(player.xcor())>600:
    player.setx(player.xcor()*-1)
  if abs(player.ycor())>450:
    player.sety(player.ycor()*-1)
  player.setheading(player.towards(canvas.winfo_pointerx()-780, -canvas.winfo_pointery()+460))

def attack():
  global nextattack
  if nextattack<=0:
      nextattack=DELAY
      laser = trtl.Turtle(shape = "square")
      laser.penup()
      laser.goto(player.pos())
      laser.color("red", "white")
      laser.setheading(player.heading())
      laser.shapesize(0.5, 2, 3)
      lasers.append([laser, LASERLIFE])
  
def move_lasers():
  for laser in lasers:
    laser[0].forward(LASERSPEED)
    laser[1] -= 1
    if abs(laser[0].xcor())>600:
      laser[0].setx(laser[0].xcor()*-1)
    if abs(laser[0].ycor())>450:
      laser[0].sety(laser[0].ycor()*-1)
    if laser[1]<=0:
      laser[0].hideturtle()
      lasers.remove(laser)

def meteor_spawn(amount):
  for line in range(amount):
    meteor = trtl.Turtle(shape="circle")
    meteor.color("gray", "darkgray")
    meteor.shapesize(2,2,8)
    meteor.penup()
    while meteor.distance(player)<200:
      meteor.goto(rand.randint(-600, 600), rand.randint(-450, 450))
    meteor.setheading(rand.randint(0, 360))
    enemies.append(meteor)

def meteor_move():
  for meteor in enemies:
    meteor.forward(5)
    if abs(meteor.xcor())>600:
      meteor.setx(meteor.xcor()*-1)
    if abs(meteor.ycor())>450:
      meteor.sety(meteor.ycor()*-1)

def tick(hp):
  global nextattack
  #music
  sound.playsound("Space Fighter Loop.mp3")
  # movement
  move(1)
  # Lasers and such
  nextattack-=1
  if key.is_pressed("Space"):
    attack()
  # move everything
  move_lasers()
  meteor_move()
  for meteor in enemies:
    for laser in lasers:
      if laser[0].distance(meteor)<50:
        meteor.hideturtle()
        laser[0].hideturtle()
        enemies.remove(meteor)
        laser[1] = 0 
    # check if the player is hurt
    if meteor.distance(player)<45:
      hp-=1
      meteor.hideturtle()
      if len(enemies)>0:
        enemies.remove(meteor)
  if len(enemies)<=0:
    print("Win!")
    space.bye()
    return
  elif hp<=0:
    print("Loss...")
    space.bye()
    return
  # Write the player's health
  player.clear()
  player.write("health: "+str(hp), False, "center", ["sans serif", 20])
  space.update()
  space.ontimer(lambda: tick(hp), 33)
meteor_spawn(50)
tick(MAXHEALTH)
space.mainloop()`

This would not be a problem if the game didn't wait for the sound to finish. I need to tell the code to not wait, but how?

  • Perhaps read the `playsound` documentation? "There’s an optional second argument, block, which is set to True by default. Setting it to False makes the function run asynchronously." – jasonharper Jan 30 '23 at 16:18

0 Answers0