I really need some help with a chunk of code for a simple car game I'm making. I'm quite new to coding so this might be really easy for people more advanced. Whenever you hit something in the game a crash() function is called, this causes it to run the crash loop, then freeze for no apparent reason (this is the problem). Please help me with this, I've tried separating things out to find the cause, trying different values and variables and a ton of other things but to no success.t. PS: I'm using Python 3.6 and Pygame 1.9.
Problematic loop:
def crash():
if invincibility==False:
gameExit=True
blitBackground()
text(2,'You crashed!',88,blk,dW/2,dH/6) #(2 means the text coords will start in the middle and not top left)
text(2,('Your total score is '+str(score)+'! '),49,blk,dW/2,dH/3)
text(2,'You crashed!',90,whte,dW/2,dH/6) #(coords, txt, font, colour, x coords, y coords)
text(2,('Your total score is '+str(score)+'! '),50,whte,dW/2,dH/3)
ad=1 #loop variable
buttonW=250 #button Width
buttonH=125 #button height
bX=dW/2 #button position on x axis
#dH and dW is just displayHeight and display Width
bY=dH-dH/3 #button position on y axis
a=1 #variable that shows if you're hovering over button 1 (main menu button)
b=1 #variable that shows if you're hovering over button 2 (keep playing)
while ad<2: #loop
mousePos=pygame.mouse.get_pos()
mClick=pygame.mouse.get_pressed()
if mousePos[0]>bX-buttonW/2+buttonW/2 and mousePos[0]<bX-buttonW/2+buttonW/2+buttonW and mousePos[1]>dH/2+buttonH/1.75 and mousePos[1]<dH/2+buttonH/1.75+buttonH: #basically asks if mouse is hovering over button 1
a=2
gameDisplay.blit(buttonImgHighlighted,(bX-buttonW/1.5,dH/2))
text(2,'Main menu',40,whte,bX-buttonW/2+buttonW/2,dH/2+buttonH/1.75)
text(2,'Main menu',38,blk,bX-buttonW/2+buttonW/2,dH/2+buttonH/1.75)
if mClick[0]==1:
ad=4
mainMenu()
else:
gameDisplay.blit(buttonImgIdle,(bX-buttonW/1.5,dH/2))
if mousePos[0]>bX-buttonW/2+buttonW-buttonW/2 and mousePos[0]<bX-buttonW/2+buttonW-buttonW/2+buttonW and mousePos[1]>dH-dH/4+buttonH/1.75 and mousePos[1]<dH-dH/4+buttonH/1.75+buttonH:
b=2
gameDisplay.blit(buttonImgHighlighted,(bX-buttonW/1.5,dH-dH/4))
text(2,'Keep playing',40,whte,bX-buttonW/2+buttonW-buttonW/2,dH-dH/4+buttonH/1.75)
text(2,'Keep playing',38,blk,bX-buttonW/2+buttonW-buttonW/2,dH-dH/4+buttonH/1.75)
if mClick[0]==1:
ad=4
game_loop()
else:
gameDisplay.blit(buttonImgIdle,(bX-buttonW/1.5,dH-dH/4))
if a==1:
text(2,'Main menu',40,blk,bX-buttonW/2+buttonW/2,dH/2+buttonH/1.75) #if button isn't hovered over, text doesnt have a shadow
if b==1:
text(2,'Keep playing',40,blk,bX-buttonW/2+buttonW-buttonW/2,dH-dH/4+buttonH/1.75)
pygame.display.update()
clock.tick(10)
Whole code: (so you can run it yourself and troubleshoot it easier)
PS:I know it's not perfect, but I'm trying to get the main concepts down, then optimise it.
import pygame
import time
import random
pygame.init()
carW=55
carH=120
dW=1200#====Default setting
dH=800#=====Everything is optimised for any resolution
#RGB
orange=(255,130,0)
grass=(0,102,51)
yellow=(255,255,0)
blk=(0,0,0)
whte=(255,255,255)
red=(255,0,0)
green=(0,255,0)
blue=(0,0,255)
gray=(64,64,64)
rdm=(random.randrange(0,255),random.randrange(0,255), random.randrange(0,255))
txtClr=blk
gameDisplay = pygame.display.set_mode((dW,dH))
pygame.display.set_caption('Skrrr skrrr')
clock= pygame.time.Clock()
carImg= pygame.image.load('C:\\Users\\gabyb\\Desktop\\Python code\\Resources\\v.jpg')
carImg= pygame.transform.scale(carImg, (carW, carH))
buttonImgIdle=pygame.image.load('C:\\Users\\gabyb\\Desktop\\Python code\\Resources\\button.png')
buttonImgIdle= pygame.transform.scale(buttonImgIdle, (int(dW/3.42857142857), int(dH/5.51724137931)))
buttonImgHighlighted=pygame.image.load('C:\\Users\\gabyb\\Desktop\\Python code\\Resources\\buttonHilighted.png')
buttonImgHighlighted=pygame.transform.scale(buttonImgHighlighted, (int(dW/3.42857142857), int(dH/5.51724137931)))
menuBackground=pygame.image.load('C:\\Users\\gabyb\\Desktop\\Python code\\Resources\\menu.jpg')
menuBackground= pygame.transform.scale(menuBackground, (dW, dH))
########################################################################################Function list
def score_count():
text(2,'Score: '+str(score),36,blk,roadEnd/2-5,25)
text(2,'Score: '+str(score),34,whte,roadEnd/2-5,25)
def rectangle(thngX,thngY,thngW,thngH,colour):
pygame.draw.rect(gameDisplay, colour, [thngX,thngY,thngW,thngH])
def car(x,y):
gameDisplay.blit(carImg,(x,y))
def text_objects(text, font,colour):
textSurface=font.render(text, True, colour)
return textSurface, textSurface.get_rect()
def message_display(text,seconds,colour,Wloc,Hloc,size):
txtClr=colour
largeText=pygame.font.Font('freesansbold.ttf',size)#90
TextSurf, TextRect = text_objects(text,largeText, txtClr)
TextRect.center=((Wloc),(Hloc))
gameDisplay.blit(TextSurf, TextRect)
pygame.display.update()
time.sleep(seconds)
def text(c,text,size,colour,Wloc,Hloc):
if c==2:
txtClr=colour
largeText=pygame.font.Font('freesansbold.ttf',size)#90
TextSurf, TextRect = text_objects(text,largeText, txtClr)
TextRect.center=((Wloc),(Hloc))
gameDisplay.blit(TextSurf, TextRect)
if c==1:
font=pygame.font.SysFont(None,size)
tcxt=font.render(str(text),True, colour)
gameDisplay.blit(tcxt,(Wloc,Hloc))
#def crash():
# if invincibility==False:
# blitBackground()
# txtClr=(blue)
# text(2,'You crashed!',70,blk,dW/2,dH/2.75) #(text,seconds,colour,Wloc,Hloc,size)
# text(2,('Your total score is '+str(score)+'! '),50,whte,dW/2,(dH/3.5)*2)
# pygame.display.update()
# time.sleep(4)
# game_loop()
def crash():
if invincibility==False:
gameExit=True
blitBackground()
txtClr=(blue)
text(2,'You crashed!',88,blk,dW/2,dH/6) #(text,seconds,colour,Wloc,Hloc,size)
text(2,('Your total score is '+str(score)+'! '),49,blk,dW/2,dH/3)
text(2,'You crashed!',90,whte,dW/2,dH/6) #(text,seconds,colour,Wloc,Hloc,size)
text(2,('Your total score is '+str(score)+'! '),50,whte,dW/2,dH/3)
ad=1
buttonW=250
buttonH=125
bX=dW/2
bY=dH-dH/3
a=1
b=1
while ad<2:
mousePos=pygame.mouse.get_pos()
#print (mousePos)
mClick=pygame.mouse.get_pressed()
#print(mClick)
if mousePos[0]>bX-buttonW/2+buttonW/2 and mousePos[0]<bX-buttonW/2+buttonW/2+buttonW and mousePos[1]>dH/2+buttonH/1.75 and mousePos[1]<dH/2+buttonH/1.75+buttonH:
a=1
gameDisplay.blit(buttonImgIdle,(bX-buttonW/1.5,dH/2))
text(2,'Main menu',40,whte,bX-buttonW/2+buttonW/2,dH/2+buttonH/1.75)
text(2,'Main menu',38,blk,bX-buttonW/2+buttonW/2,dH/2+buttonH/1.75)
if mClick[0]==1:
ad=4
mainMenu()
else:
gameDisplay.blit(buttonImgHighlighted,(bX-buttonW/1.5,dH/2))
if mousePos[0]>bX-buttonW/2+buttonW-buttonW/2 and mousePos[0]<bX-buttonW/2+buttonW-buttonW/2+buttonW and mousePos[1]>dH-dH/4+buttonH/1.75 and mousePos[1]<dH-dH/4+buttonH/1.75+buttonH:
b=2
gameDisplay.blit(buttonImgIdle,(bX-buttonW/1.5,dH-dH/4))
text(2,'Keep playing',40,whte,bX-buttonW/2+buttonW-buttonW/2,dH-dH/4+buttonH/1.75)
text(2,'Keep playing',38,blk,bX-buttonW/2+buttonW-buttonW/2,dH-dH/4+buttonH/1.75)
if mClick[0]==1:
ad=4
game_loop()
else:
gameDisplay.blit(buttonImgHighlighted,(bX-buttonW/1.5,dH-dH/4))
if a==1:
text(2,'Main menu',40,blk,bX-buttonW/2+buttonW/2,dH/2+buttonH/1.75)
if b==1:
text(2,'Keep playing',40,blk,bX-buttonW/2+buttonW-buttonW/2,dH-dH/4+buttonH/1.75)
pygame.display.update()
clock.tick(10)
def blitBackground():
gameDisplay.fill(gray)
rectangle(0,0,roadEnd,dH,grass)
rectangle(dW-roadEnd,0,roadEnd,dH,grass)
edge(0,whte)
edges()
car(x,y)
rectangle(thng_strtX, thng_strtY, thng_width, thng_height, rdm)
rectangle(thng_strtXa, thng_strtYa, thng_width, thng_height, rdm)
rectangle(thng_strtXb, thng_strtYb, thng_width, thng_height, rdm)
rectangle(thng_strtXc, thng_strtYc, thng_width, thng_height, rdm)
rectangle(point_strtX, point_strtY, point_width, point_height, green)#######
score_count()
pygame.display.update()
def getReady():
blitBackground()
message_display('Ready?',1,red,dW/2,dH/2,90)#(text,seconds,colour,Wloc,Hloc,size)
blitBackground()
message_display('Get set.',1, yellow,dW/2,dH/2,90)
blitBackground()
message_display('Go!',1,green ,dW/2,dH/2,90)
blitBackground()
def edge(p,r):
rectangle(roadEnd-10,sqry+p,26,20,r)
rectangle(dW-roadEnd-13,sqry+p,26,20,r)
def cones(add,a):
edge(20+add,red)
edge(40+add,whte)
edge(60+add,red)
edge(80+add,whte)
edge(20-a,red)
edge(40-a,whte)
edge(60-a,red)
edge(80-a,whte)
def edges():
cones(0,0)
cones(80,0)
cones(160,0)
cones(240,0)
cones(320,0)
cones(400,0)
cones(480,0)
cones(560,0)
cones(640,0)
cones(720,0)
cones(800,0)
cones(0,80)
cones(0,160)
cones(0,240)
cones(0,320)
cones(0,400)
cones(0,480)
cones(0,560)
cones(0,640)
cones(0,720)
cones(0,800)
#######################################################################################
def mainMenu():
mainMenu=True
buttonW=int(dW/3.42857143)#349
buttonH=int(dH/5.51724138)#144
avg=(buttonW+buttonH)/2 #246.5
while mainMenu==True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
print ('end')
if event.type==pygame.KEYDOWN:
#'''quitt'''
if event.key==pygame.K_ESCAPE:
pygame.quit()
print ('end')
gameDisplay.blit(menuBackground,(0,0))
text(2,'Skrr skrr',int(avg/1.82592592593),blk,dW/2,dH/10)#135
text(2,'Skrr skrr',int(avg/1.89615384615),whte,dW/2,dH/10)#130
pygame.draw.line(gameDisplay, blk,(dW/2-int(avg/0.8216),dH/10+int(avg/4.1083)),(dW/2+int(avg/0.8216), dH/10+int(avg/4.1083)),int(avg/18.9615384615))
pygame.draw.line(gameDisplay, whte,(dW/2-int(avg/0.8216),dH/10+int(avg/4.1083)),(dW/2+int(avg/0.8216), dH/10+int(avg/4.1083)),int(avg/49.3))
mousePos=pygame.mouse.get_pos()
mouseClick= pygame.mouse.get_pressed()
#W-350 H-145
a=1
b=1
if mousePos[0]>dW/10 and mousePos[0]<dW/10+buttonW and mousePos[1]>dH/2 and mousePos[1]<dH/2+buttonH:
gameDisplay.blit(buttonImgHighlighted,(dW/10,dH/2))
a=2
text(2,'Start',int(avg/4.95+2),blk,dW/10+buttonW/2,dH/2+buttonH/2)#52
text(2,'Start',int(avg/4.95),whte,dW/10+buttonW/2,dH/2+buttonH/2)
if mouseClick[0]==1:
mainMenu=False
game_loop()
else:
gameDisplay.blit(buttonImgIdle,(dW/10,dH/2))
if mousePos[0]>dW-dW/10-buttonW and mousePos[0]<dW-dW/10 and mousePos[1]>dH/2 and mousePos[1]<dH/2+buttonH:
gameDisplay.blit(buttonImgHighlighted,(dW-dW/10-350,dH/2))
b=2
text(2,'No, don\'t!',int(avg/4.95+2),whte,dW-dW/10-buttonW+buttonW/2,dH/2+buttonH/2)
text(2,'No, don\'t!',int(avg/4.95),red,dW-dW/10-buttonW+buttonW/2,dH/2+buttonH/2)
if mouseClick[0]==1:
mainMenu=False
pygame.quit()
else:
gameDisplay.blit(buttonImgIdle,(dW-dW/10-buttonW,dH/2))
if a==1:
text(2,'Start',int(avg/4.95+2),whte,dW/10+buttonW/2,dH/2+buttonH/2)
text(2,'Start',int(avg/4.95),blk,dW/10+buttonW/2,dH/2+buttonH/2)
if b==1:
text(2,'Quit',int(avg/4.95+2),whte,dW-dW/10-buttonW+buttonW/2,dH/2+buttonH/2)
text(2,'Quit',int(avg/4.95),blk,dW-dW/10-buttonW+buttonW/2,dH/2+buttonH/2)
pygame.display.update()
########################################################################################
#gameloooooooooooooooooooooooop
def game_loop():
devmode=True
hg=0
global z
global h
z=0
h=0
global roadEnd
roadEnd=200
global score
score=0
global x
global y
x=(dW * 0.47)
y=(dH*0.75)
global sqry
sqry=0
paus=False
x_change=0
y_change=0
global invincibility
invincibility=False
toggle=1
speed=3
akd=1
global thng_width
global thng_strtX
global thng_strtY
global thng_height
global thng_strtXa
global thng_strtYa
global thng_strtXb
global thng_strtYb
global thng_strtXc
global thng_strtYc
global thng_strtXd
global thng_strtYd
thng_width=55
thng_strtX=random.randrange(roadEnd+thng_width,dW-roadEnd-thng_width)
thng_strtY=-450 #obstacle dymentions
thng_height=120
thng_strtXa=random.randrange(roadEnd+thng_width,dW-roadEnd-thng_width)
thng_strtYa=-450
thng_strtXb=random.randrange(roadEnd+thng_width,dW-roadEnd-thng_width)
thng_strtYb=-450
thng_strtXc=random.randrange(roadEnd+thng_width,dW-roadEnd-thng_width)
thng_strtYc=-450
thng_strtXd=random.randrange(roadEnd+thng_width,dW-roadEnd-thng_width)
thng_strtYd=-450
global point_width
global point_strtX
global point_strtY
global point_height
point_width=20
point_strtX=random.randrange(roadEnd+point_width+10+10,dW-roadEnd-point_width-20) #point dymentions
point_strtY=-450
point_height=20
x=(dW * 0.47)
y=(dH*0.75)
car(x,y)
pygame.display.update()
getReady()
gameExit=False
while not gameExit:
gameDisplay.fill(gray)
rectangle(0,0,roadEnd,dH,grass)
rectangle(dW-roadEnd,0,roadEnd,dH,grass)
edge(0,whte)
edges()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
print ('end')
if event.type==pygame.KEYDOWN: #'''Pressing of controls'''
if event.key==pygame.K_ESCAPE:
gameExit=True
mainMenu()
if event.key == pygame.K_a:
x_change = -3
if event.key==pygame.K_d:
x_change=3
if event.key==pygame.K_w:
y_change=-2.4
if event.key==pygame.K_s:
y_change=4.5
#if devmode==False:
#if event.key == pygame.K_p:
#############################normal pause feature
if devmode==True:
if event.key == pygame.K_z:
hg=-0.01
if event.key == pygame.K_x:
hg=0.01
if event.key==pygame.K_b:
speed+=0.5
#add text to tell you if youre invincible, your speed, etc.
if event.key==pygame.K_v:
speed+=-0.5
if event.key==pygame.K_e:
if akd==1:
akd=2
ahg=speed
speed=0
paus=True
#######add pause feature
elif akd==2:
akd=1
speed=ahg
paus=False
if event.key==pygame.K_c:
score+=10
if event.key==pygame.K_q:
if toggle==1:
invincibility=True
toggle=2
else:
invincibility=False
toggle=1
if event.type==pygame.KEYUP: #'''Release of controls'''
if event.key == pygame.K_z or event.key == pygame.K_x:
hg=0
if event.key==pygame.K_a or event.key==pygame.K_d:
x_change = 0
if event.key==pygame.K_w or event.key==pygame.K_s:
y_change = 0
if event.key==pygame.K_x or event.key==pygame.K_z:
speed=speed
if speed<0:
speed=0
speed=speed+hg
sqry=sqry+speed*1.55
#x,y,w,h,color
#####add start line
#add cars starting race with you and speeding
#off top of screen
#find way to de-blit said finishing line and cars
#after a while, pass the finishing line again..
#maybe add powerups like slowmotion (change clock ticks to less and move mouse or give lots of inputs to print)
#,invincibility for like 3 secs etc
#fix things spawing inside each other
#add models
#replace images with royality free ones
x=x+x_change
y=y+y_change #Movement
car(x,y)
score_count()
rectangle(thng_strtX, thng_strtY, thng_width, thng_height, rdm)#######
thng_strtY += speed
rectangle(point_strtX, point_strtY, point_width, point_height, green)#######
point_strtY += speed
if z>1:
rectangle(thng_strtXa, thng_strtYa, thng_width, thng_height, rdm)
thng_strtYa += speed*(random.randrange(100,150)/100)
if x+55>thng_strtXa+6.5 and x<thng_strtXa+thng_width-6.5 and y<thng_strtYa+thng_height-6.5 and y+120>thng_strtYa+6.5:
crash()
if z>2:
rectangle(thng_strtXb, thng_strtYb, thng_width, thng_height, rdm)
thng_strtYb += speed*(random.randrange(100,150)/150)
if x+55>thng_strtXb+6.5 and x<thng_strtXb+thng_width-6.5 and y<thng_strtYb+thng_height-6.5 and y+120>thng_strtYb+6.5:
crash()
if z>3:
rectangle(thng_strtXc, thng_strtYc, thng_width, thng_height, rdm)
thng_strtYc += speed*(random.randrange(100,150)/150)
if x+55>thng_strtXc+6.5 and x<thng_strtXc+thng_width-6.5 and y<thng_strtYc+thng_height-6.5 and y+120>thng_strtYc+6.5:
crash()
if sqry>dH:
sqry=-30
if thng_strtYb>dH:
thng_strtYb=0-thng_width-20 #obstcles
thng_strtXb=random.randrange(roadEnd+10+10+10,dW-roadEnd-thng_width-10-10)
if thng_strtYc>dH:
thng_strtYc=0-thng_width-20 #obstcles
thng_strtXc=random.randrange(roadEnd+10+10+10,dW-roadEnd-thng_width-10-10)
if thng_strtY>dH:
thng_strtY=0-thng_width-20 #obstcles
thng_strtX=random.randrange(roadEnd+10+10+10,dW-roadEnd-thng_width-10-10)
if point_strtY>dH:
point_strtY=0-thng_width-20
point_strtX=random.randrange(roadEnd+5+10+10+10,dW-roadEnd-point_width-5-10-10)
if x>dW-roadEnd+10-55:
if invincibility==False:
x_change=4.5
if event.type==pygame.KEYUP:
if event.key==pygame.K_a or event.key==pygame.K_d:
x_change = 4.5
if event.key==pygame.K_w or event.key==pygame.K_s:
y_change = 1.5
if event.type==pygame.KEYDOWN:
if event.key==pygame.K_a or event.key==pygame.K_d:
x_change = 4.5
if event.key==pygame.K_w or event.key==pygame.K_s:
y_change = 1.5
if x>dW+4-55: #spinning out and crashing
crash()
if x<roadEnd-10:
if invincibility==False:
x_change= -4.5
if event.type==pygame.KEYUP:
if event.key==pygame.K_a or event.key==pygame.K_d:
x_change = -4.5
if event.key==pygame.K_w or event.key==pygame.K_s:
y_change = 1.5
if event.type==pygame.KEYDOWN:
if event.key==pygame.K_a or event.key==pygame.K_d:
x_change = -4.5
if event.key==pygame.K_w or event.key==pygame.K_s:
y_change = 1.5
if x<0-4:
crash()
if x+55>thng_strtX+6.5 and x<thng_strtX+thng_width-6.5 and y<thng_strtY+thng_height-6.5 and y+120>thng_strtY+6.5:
crash()
if x+55>point_strtX and x<point_strtX+point_width and y<point_strtY+point_height and y+120>point_strtY:
point_strtY=0-thng_width-20 #points
point_strtX=random.randrange(roadEnd+10+5,dW-roadEnd-15)
score=score+1
speed+=0.063
if score%10==0:
z=z+1
if z>4:
z=4
if thng_strtYa>dH:
thng_strtYa=0-thng_width-20 #obstcles respawn
thng_strtXa=random.randrange(roadEnd+10+10+10,dW-roadEnd-thng_width-10-10)
if y<=dH/10+2:
y_change=+0
#'''Stopping point for top of screen'''
if y<dH/10:
y_change=+2
if y>dH-152:
y_change=-0
#'''Stopping point for botton of screen'''
if y>dH-148:
y_change=-4
if paus==True:
text(2,'Paused.',90,orange,dW/2,dH/2)
pygame.display.update()
clock.tick(5000)
mainMenu()
pygame.quit()
print ('end')