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?