I am currently taking an A level computer science course in which I have to create a game for a project. I know this code is probably not efficient but I am trying to keep it to my own work and would like a hand with two bits that I am a bit stuck on
This code currently starts with a intro screen and once in the game, scrolls left,right and removes lives when the player falls off of the screen. When all lives are lost there is a game over screen that is shown
I was wondering if there was a way to set a limit to the scrolling screen so that when the player goes left it stops scrolling at a certain point and stops the player at the edge of the screen to stop them falling off. I want to set the far left of the bottom platform to be the edge, this forces the player to go right
Another small one is if there is any way to reduce lag
If there is anymore information you need to help feel free to ask Any suggestions would be appreciated Thanks for any help
import pygame as pg
import time
import random
pg.init()#initiates pygame
display_height = 690#Creates width and height of screen
display_width = 1024
#Colours
white = (255,255,255)
black = (0,0,0)
red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)
grass = (24,85,36)
yellow = (255,255,0)
lightGrey = (184,184,184)
grey = (73,71,65)
Robot_height = 99#Height of robot
Robot_width = 112#Width of robot
Bullet_Fired = False
PowerUp_Active = False
Robot_acc = 0.3 #Robot Acceleration
vec = pg.math.Vector2
gameDisplay = pg.display.set_mode((display_width,display_height)) #Sets display properties of window
pg.display.set_caption ("Game") #Title on window
clock = pg.time.Clock()
robotImg = pg.image.load("robot1.png") #Loads robots image
lifeImg = pg.image.load("Life.png")#Loads image from folder
lifeImg = pg.transform.scale(lifeImg, (80, 80))#Sets dimensions of image
backgroundImg = pg.image.load("Background.png")#Loads background image
backgroundImg = pg.transform.scale(backgroundImg, (display_width, display_height))#Sets dimensions of background to fit the screen
inBackgroundImg = pg.image.load("IntroBackground1.png")#Loads intro background
controlsImg = pg.image.load("controls.png")#Loads controls screen background
controlsImg = pg.transform.scale(controlsImg, (display_width, display_height))#Sets dimensions to fit screen
largeText = pg.font.Font("Font.ttf",77)#Large text set
smallText = pg.font.Font("Font.ttf",32)#Small text set
#Class for platforms
class Platform(pg.sprite.Sprite):
def __init__(self, x,y,w,h):
pg.sprite.Sprite.__init__(self)
self.image = pg.Surface((w,h))#sets width and height of platform
self.image.fill(grass)#Fills rectangle with blue
self.rect = self.image.get_rect()#Rectangle set
self.rect.x = x#x position
self.rect.y = y#y position
#List of platforms
PLATFORM_LIST = [[0,display_height - 40,display_width,40],
[display_width + 300,display_height - 40,display_width,40],
[display_width /2 - 50,display_height * 3/4,100,20],
[display_width -10,display_height * 3/4,100,20]]
#Platform group
platforms = pg.sprite.Group()
#Checks through "PLATFORM_LIST" and adds all the platforms the the grounp "platforms"
for plat in PLATFORM_LIST:
p = Platform(*plat)
platforms.add(p)
#Draws platforms to the screen
def draw():
for plat in platforms:
pg.draw.rect(gameDisplay, grass, plat)
#Class for robot
class RobotClass(pg.sprite.Sprite):
def __init__(self):
pg.sprite.Sprite.__init__(self)
self.image = pg.Surface((Robot_width,Robot_height))#Height and width of the robot
self.rect = self.image.get_rect()#Gets rectangle of robot
self.rect.center = (display_width / 2, display_height / 2)#Location of center of robot
self.RobotPos = vec(display_width / 2, display_height / 2)#Position of robot as vector
self.bottom = (0,0)#Bottom of robot
self.vel = vec(0, 0)#Robots velocity
self.acc = vec(0, 0.3)#Robots Acceleration
startX = display_width/2
startY = display_height/2
#Creates Robot
Robot = RobotClass()
#Jump function
def jump():
#Checks pixel below robot to see if there is a collision
Robot.rect.x = Robot.rect.x +1
hits = pg.sprite.spritecollide(Robot , platforms, False)
Robot.rect.x = Robot.rect.x -1
if hits:
#Gives robot velocity of 5 upwards
Robot.vel.y = -10
#Settings for text
def text_objects(text, font):
textSurface = font.render(text, True, white)
return textSurface, textSurface.get_rect()
#Displays lives of Robot
def display_lives(lives):
global lifeImg
TextSurf, TextRect = text_objects("Lives:", smallText)#Sets text and font
TextRect.topleft = (1,16)#Places text in top left of screen
gameDisplay.blit(TextSurf, TextRect) #displays text
if lives == 3:#Displays 3 spanners
gameDisplay.blit(lifeImg,(110,0))
gameDisplay.blit(lifeImg,(160,0))
gameDisplay.blit(lifeImg,(210,0))
if lives == 2:#Displays 2 spanners
gameDisplay.blit(lifeImg,(110,0))
gameDisplay.blit(lifeImg,(160,0))
if lives == 1:#Displays 1 spanners
gameDisplay.blit(lifeImg,(110,0))
if lives == 0:#Should end game when all lives are lost
game_over()
#Function for button that takes parameters (message,x,y,height,width,active colour,inactive colour,text size,action)
def button(msg,x,y,w,h,i,a,t,action=None):
mouse = pg.mouse.get_pos() #Gets (x,y) position of mouse
Text = pg.font.Font("Font.ttf",t) #Lets text size be input
click = pg.mouse.get_pressed() #Gets whenther mouse has been clicked (mouse1,middle mouse,mouse2)
if x+w > mouse[0] > x and y+50 > mouse[1] > y:#Checks to see if mouse is within boundaries of button
pg.draw.rect(gameDisplay, a,(x,y,w,h),5)#Changes color of box when being hovered over
if click[0] == 1 and action != None:#If mouse1 is clicked and there is an action to be performed it will be run
action()#action is parameter and the () is used to initiate function
else:
pg.draw.rect(gameDisplay, i,(x,y,w,h),5)#Sets default button
TextSurf, TextRect = text_objects(msg, Text)#Runs text_objects with inputted parameter of the message
TextRect.center = ((x+(w/2)),(y+(h/2)))#Places text inside the button
gameDisplay.blit(TextSurf, TextRect)#Displays text
def Exit():#Used for button on intro screen to exit
pg.quit()
quit()
#What happens when player runs out of lives
def game_over():
while True:
for event in pg.event.get():#lets window be closed
if event.type == pg.QUIT:
pg.quit()
quit()
gameDisplay.blit(inBackgroundImg, (0, 0))
TextSurf, TextRect = text_objects(("Game"), largeText)#Places large text on screen
TextRect.center = ((display_width/2+10),(180))#location of text
gameDisplay.blit(TextSurf, TextRect)
TextSurf, TextRect = text_objects(("Over"), largeText)
TextRect.center = ((display_width/2+10),(280))
gameDisplay.blit(TextSurf, TextRect)
pg.draw.rect(gameDisplay, yellow,(290,125,445,220),5)#Puts yellow box over game over
button("Retry",410,600,207,70,yellow,lightGrey,45,game_loop)
button("Quit",display_width-105,display_height-55,100,50,yellow,lightGrey,33,Exit)
pg.display.update()#updates screen
clock.tick(15)
#Function for control screen
def controls():
while True:
for event in pg.event.get():#lets window be closed
if event.type == pg.QUIT:
pg.quit()
quit()
gameDisplay.blit(controlsImg, (0, 0))#Places controlsImg on screen
button("Back",5,display_height-55,100,50,black,grey,30,game_intro)#places back button in bottom left corner
pg.display.update()#updates screen
clock.tick(15)#sets clock rate
#Function to gun the intro screen
def game_intro():
while True:
for event in pg.event.get():#lets window be closed
if event.type == pg.QUIT:
pg.quit()
quit()
gameDisplay.blit(inBackgroundImg, (0, 0))#Places background image
TextSurf, TextRect = text_objects(("Lost on planet X"), largeText)#Places large text on screen
TextRect.center = ((display_width/2),(200))#location of text
gameDisplay.blit(TextSurf, TextRect)#displays text
pg.draw.rect(gameDisplay, yellow,(65,130,900,150),5)#Puts yellow box over title
button("Play",412,550,200,50,yellow,lightGrey,36,game_loop) #Play button at middle bottom
button("Controls",412,450,200,50,yellow,lightGrey,32,controls) #Controls button in middle of screen
button("Quit",display_width-105,display_height-55,100,50,yellow,lightGrey,33,Exit) #Quit button in bottom right
pg.display.update()#updates screen
clock.tick(15)#sets clock rate
#game loop
def game_loop():
global PLATFORM_LIST
global startX
global startY
global backgroundImg
Robot.RobotPos = (startX,startY)
lives = 3 #Robot Lives
Robot_friction = -0.3 #Friction value
vec = pg.math.Vector2 #Setting vec as vector quantity
while True:
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit
quit()
#Starts acceleration when key is pressed
if event.type == pg.KEYDOWN:
if event.key == pg.K_LEFT:
Robot.acc.x = -Robot_acc
elif event.key == pg.K_RIGHT:
Robot.acc.x = Robot_acc
elif event.key == pg.K_UP:
jump()
#Adds friction to accleration to slow robot down when key is not being pressed
if event.type == pg.KEYUP:
if event.key == pg.K_LEFT or event.key == pg.K_RIGHT:
Robot.acc.x = Robot.acc.x * Robot_friction
#Adjusts velocity of robot by adding the acceleration on each cycle
Robot.vel = Robot.vel+ Robot.acc
#gameDisplay.fill(sky)
gameDisplay.blit(backgroundImg,(0,0))
#Draws the platforms to the screen and adds them to platform group
draw()
#Changes Robot position according to its velocity,acceleration and the friction
Robot.RobotPos = Robot.RobotPos + Robot.vel + 0.5 * Robot.acc
#Loads robot onto screen
gameDisplay.blit(robotImg,(Robot.rect))
#pg.draw.rect(gameDisplay, red, Robot.rect, 2
display_lives(lives)#lives
pg.display.update()#Updates display
clock.tick(60)
#Sets bottom of robot to its position
Robot.rect.midbottom = Robot.RobotPos
#Collision detection
if Robot.vel.y > 0:
hits = pg.sprite.spritecollide(Robot , platforms, False)
if hits:
#Puts Robot on top of platform
Robot.RobotPos.y = hits[0].rect.top + 1
Robot.vel.y = 0
#Scrolling
if Robot.rect.left < display_width/4:
Robot.RobotPos.x = Robot.RobotPos.x + abs(Robot.vel.x)
startX = startX + abs(Robot.vel.x)
for plat in platforms:
plat.rect.x = plat.rect.x + int(abs(Robot.vel.x))
draw()
if Robot.rect.right > (display_width-display_width/4):
Robot.RobotPos.x = Robot.RobotPos.x - abs(Robot.vel.x)
startX = startX - abs(Robot.vel.x)
for plat in platforms:
plat.rect.x = plat.rect.x - int(abs(Robot.vel.x))
draw()
#Losing a life
if Robot.rect.top > display_height:
lives = lives - 1
Robot.RobotPos.y = Robot.RobotPos.y - (40+Robot_height)
Robot.RobotPos.x = Robot.RobotPos.x - 200
Robot.vel.x = 0
#Sets top velocity of robot
if Robot.vel.x > 6:
Robot.vel.x = 6
if Robot.vel.x < -6:
Robot.vel.x = -6
#Makes robot velocity = 0 when it is close to 0
if Robot.vel.x < 0.05 and Robot.vel.x > -0.05:
Robot.acc.x = 0
Robot.vel.x = 0
game_intro()
pg.quit()
quit()
I managed to complete this problem myself so I will briefly explain what I did.
I added a variable called off set which tracked how far away the scrolled screen was from the original position.
offset = 0
I then added this variable into my scrolling code
if Robot.rect.left < display_width/4:
Robot.RobotPos.x = Robot.RobotPos.x + abs(Robot.vel.x)
startX = startX + int(abs(Robot.vel.x))
offset = offset + int(abs(Robot.vel.x))
for plat in platforms:
plat.rect.x = plat.rect.x + int(abs(Robot.vel.x))
for coin in coins:
coin.rect.x = coin.rect.x + int(abs(Robot.vel.x))
if Robot.rect.right > (display_width-display_width/4):
Robot.RobotPos.x = Robot.RobotPos.x - abs(Robot.vel.x)
startX = startX - int(abs(Robot.vel.x))
offset = offset - int(abs(Robot.vel.x))
for plat in platforms:
plat.rect.x = plat.rect.x - int(abs(Robot.vel.x))
for coin in coins:
coin.rect.x = coin.rect.x - int(abs(Robot.vel.x))
I then added an extra if to this function. This only runs the scroll part off the code when the offset is smaller then zero. Any values that are bigger than zero indicate that the screen has been offset to the left. This code therefore only lets you scroll when you are not at the edge of the screen
if offset > 0:
pass
elif Robot.rect.left < display_width/4:
Robot.RobotPos.x = Robot.RobotPos.x + abs(Robot.vel.x)
startX = startX + int(abs(Robot.vel.x))
offset = offset + int(abs(Robot.vel.x))
for plat in platforms:
plat.rect.x = plat.rect.x + int(abs(Robot.vel.x))
for coin in coins:
coin.rect.x = coin.rect.x + int(abs(Robot.vel.x))
To then stop the sprite from falling off of the screen I added a wall at the edge using my platform function and added it to a group just in case I need to use more walls later.
w1 = Platform(0,0,10,display_height)
wall = pg.sprite.Group()
wall.add(w1)
After this I created a condition using spritecollide to check whether the sprite is touching the wall
hit = pg.sprite.spritecollide(Robot , wall,False)
if hit:
Robot.vel.x = 0
Robot.acc.x = 0
Although this worked there became a problem where it was hard for the sprite to move away from the wall since its velocity was constantly being set to 0 so I added another variable that checks if the left arrow is being pressed
hit = pg.sprite.spritecollide(Robot , wall,False)
if hit:
if left == True:
Robot.vel.x = 0
Robot.acc.x = 0
This then only resets the values if you are trying to move left
if event.type == pg.KEYDOWN:
if event.key == pg.K_LEFT:
Robot.acc.x = -Robot_acc
left = True
elif event.key == pg.K_RIGHT:
Robot.acc.x = Robot_acc
elif event.key == pg.K_UP:
jump()
elif Robot.acc.x < 0:
left = True
else:
left = False
Here is all my code together in case I missed anything out or there are different parts you want to look at.
*edit This code does not currently scroll or display the wall. The scrolling doesn't matter since the robot should be in the middle of the screen when it is scrolling so the wall will still be there but there will be no way to collide with it and it is invisible so you cant see it
Feel free to ask questions if I didn't explain a part very well or you just want some more info.
import pygame as pg
import time
import random
pg.init()#initiates pygame
display_height = 690#Creates width and height of screen
display_width = 1024
#Colours
white = (255,255,255)
black = (0,0,0)
red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)
grass = (24,85,36)
yellow = (255,255,0)
lightGrey = (184,184,184)
grey = (73,71,65)
brown = (66, 40, 13)
Robot_height = 99#Height of robot
Robot_width = 112#Width of robot
Bullet_Fired = False
PowerUp_Active = False
Robot_acc = 0.3 #Robot Acceleration
vec = pg.math.Vector2
gameDisplay = pg.display.set_mode((display_width,display_height)) #Sets display properties of window
pg.display.set_caption ("Game") #Title on window
clock = pg.time.Clock()
robotImg = pg.image.load("robot1.png") #Loads robots image
lifeImg = pg.image.load("Life.png")#Loads image from folder
lifeImg = pg.transform.scale(lifeImg, (80, 80))#Sets dimensions of image
backgroundImg = pg.image.load("Background.png")#Loads background image
backgroundImg = pg.transform.scale(backgroundImg, (display_width, display_height))#Sets dimensions of background to fit the screen
inBackgroundImg = pg.image.load("IntroBackground1.png")#Loads intro background
controlsImg = pg.image.load("controls.png")#Loads controls screen background
controlsImg = pg.transform.scale(controlsImg, (display_width, display_height))#Sets dimensions to fit screen
largeText = pg.font.Font("Font.ttf",77)#Large text set
smallText = pg.font.Font("Font.ttf",32)#Small text set
#Class for platforms
class Platform(pg.sprite.Sprite):
def __init__(self, x,y,w,h):
pg.sprite.Sprite.__init__(self)
self.image = pg.Surface((w,h))#sets width and height of platform
self.image.fill(grass)#Fills rectangle with blue
self.rect = self.image.get_rect()#Rectangle set
self.rect.x = x#x position
self.rect.y = y#y position
#List of platforms x , y , width , height
PLATFORM_LIST = [[-5,display_height - 40,2005,40],
[2300,display_height - 40,1000,40],
[1100,display_height - 190,300,20],
]
#Platform group
platforms = pg.sprite.Group()
w1 = Platform(0,0,10,display_height)
wall = pg.sprite.Group()
wall.add(w1)
#Checks through "PLATFORM_LIST" and adds all the platforms the the grounp "platforms"
for plat in PLATFORM_LIST:
p = Platform(*plat)
platforms.add(p)
#Draws platforms to the screen
def draw():
for plat in platforms:
pg.draw.rect(gameDisplay, grass, plat)
#Class for robot
class RobotClass(pg.sprite.Sprite):
def __init__(self):
pg.sprite.Sprite.__init__(self)
self.image = pg.Surface((Robot_width,Robot_height))#Height and width of the robot
self.rect = self.image.get_rect()#Gets rectangle of robot
self.rect.center = (display_width / 2, display_height / 2)#Location of center of robot
self.RobotPos = vec(display_width / 2, display_height / 2)#Position of robot as vector
self.bottom = (0,0)#Bottom of robot
self.vel = vec(0, 0)#Robots velocity
self.acc = vec(0, 0.3)#Robots Acceleration
startX = display_width/2
startY = display_height/2
#Creates Robot
Robot = RobotClass()
#Jump function
def jump():
#Checks pixel below robot to see if there is a collision
Robot.rect.x = Robot.rect.x +1
hits = pg.sprite.spritecollide(Robot , platforms, False)
Robot.rect.x = Robot.rect.x -1
if hits:
#Gives robot velocity of 5 upwards
Robot.vel.y = -10
#Settings for text
def text_objects(text, font):
textSurface = font.render(text, True, white)
return textSurface, textSurface.get_rect()
#Displays lives of Robot
def display_lives(lives):
global lifeImg
TextSurf, TextRect = text_objects("Lives:", smallText)#Sets text and font
TextRect.topleft = (1,16)#Places text in top left of screen
gameDisplay.blit(TextSurf, TextRect) #displays text
if lives == 3:#Displays 3 spanners
gameDisplay.blit(lifeImg,(110,0))
gameDisplay.blit(lifeImg,(160,0))
gameDisplay.blit(lifeImg,(210,0))
if lives == 2:#Displays 2 spanners
gameDisplay.blit(lifeImg,(110,0))
gameDisplay.blit(lifeImg,(160,0))
if lives == 1:#Displays 1 spanners
gameDisplay.blit(lifeImg,(110,0))
if lives == 0:#Should end game when all lives are lost
game_over()
#Displays score in top right of screen and takes in parameter score
def display_score(score):
#Displays the score itself
TextSurf, TextRect = text_objects(str(score), smallText)#Sets text and font
TextRect.topleft = (display_width-120,16)#Places text in top left of screen
gameDisplay.blit(TextSurf, TextRect)
#Displays the text "score" infront of the score
TextSurf, TextRect = text_objects("Score:", smallText)#Sets text and font
TextRect.topleft = (display_width-255,16)#Places text in top left of screen
gameDisplay.blit(TextSurf, TextRect)
#Function for button that takes parameters (message,x,y,height,width,active colour,inactive colour,text size,action)
def button(msg,x,y,w,h,i,a,t,action=None):
mouse = pg.mouse.get_pos() #Gets (x,y) position of mouse
Text = pg.font.Font("Font.ttf",t) #Lets text size be input
click = pg.mouse.get_pressed() #Gets whenther mouse has been clicked (mouse1,middle mouse,mouse2)
if x+w > mouse[0] > x and y+50 > mouse[1] > y:#Checks to see if mouse is within boundaries of button
pg.draw.rect(gameDisplay, a,(x,y,w,h),5)#Changes color of box when being hovered over
if click[0] == 1 and action != None:#If mouse1 is clicked and there is an action to be performed it will be run
action()#action is parameter and the () is used to initiate function
else:
pg.draw.rect(gameDisplay, i,(x,y,w,h),5)#Sets default button
TextSurf, TextRect = text_objects(msg, Text)#Runs text_objects with inputted parameter of the message
TextRect.center = ((x+(w/2)),(y+(h/2)))#Places text inside the button
gameDisplay.blit(TextSurf, TextRect)#Displays text
def Exit():#Used for button on intro screen to exit
pg.quit()
quit()
#What happens when player runs out of lives
def game_over():
while True:
for event in pg.event.get():#lets window be closed
if event.type == pg.QUIT:
pg.quit()
quit()
gameDisplay.blit(inBackgroundImg, (0, 0))
TextSurf, TextRect = text_objects(("Game"), largeText)#Places large text on screen
TextRect.center = ((display_width/2+10),(180))#location of text
gameDisplay.blit(TextSurf, TextRect)
TextSurf, TextRect = text_objects(("Over"), largeText)
TextRect.center = ((display_width/2+10),(280))
gameDisplay.blit(TextSurf, TextRect)
pg.draw.rect(gameDisplay, yellow,(290,125,445,220),5)#Puts yellow box over game over
button("Retry",410,600,207,70,yellow,lightGrey,45,game_loop)
button("Quit",display_width-105,display_height-55,100,50,yellow,lightGrey,33,Exit)
pg.display.update()#updates screen
clock.tick(15)
#Function for control screen
def controls():
while True:
for event in pg.event.get():#lets window be closed
if event.type == pg.QUIT:
pg.quit()
quit()
gameDisplay.blit(controlsImg, (0, 0))#Places controlsImg on screen
button("Back",5,display_height-55,100,50,black,grey,30,game_intro)#places back button in bottom left corner
pg.display.update()#updates screen
clock.tick(15)#sets clock rate
#Function to gun the intro screen
def game_intro():
while True:
for event in pg.event.get():#lets window be closed
if event.type == pg.QUIT:
pg.quit()
quit()
gameDisplay.blit(inBackgroundImg, (0, 0))#Places background image
TextSurf, TextRect = text_objects(("Lost on planet X"), largeText)#Places large text on screen
TextRect.center = ((display_width/2),(200))#location of text
gameDisplay.blit(TextSurf, TextRect)#displays text
pg.draw.rect(gameDisplay, yellow,(65,130,900,150),5)#Puts yellow box over title
button("Play",412,550,200,50,yellow,lightGrey,36,game_loop) #Play button at middle bottom
button("Controls",412,450,200,50,yellow,lightGrey,32,controls) #Controls button in middle of screen
button("Quit",display_width-105,display_height-55,100,50,yellow,lightGrey,33,Exit) #Quit button in bottom right
pg.display.update()#updates screen
clock.tick(15)#sets clock rate
#game loop
def game_loop():
left = False
offset = 0
global PLATFORM_LIST
global startX
global startY
global backgroundImg
Robot.RobotPos = (startX,startY)
score = 0 #Score
lives = 3 #Robot Lives
Robot_friction = -0.3 #Friction value
vec = pg.math.Vector2 #Setting vec as vector quantity
while True:
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit
quit()
#Starts acceleration when key is pressed
if event.type == pg.KEYDOWN:
if event.key == pg.K_LEFT:
Robot.acc.x = -Robot_acc
left = True
elif event.key == pg.K_RIGHT:
Robot.acc.x = Robot_acc
elif event.key == pg.K_UP:
jump()
elif Robot.acc.x < 0:
left = True
else:
left = False
print(left)
#Adds friction to accleration to slow robot down when key is not being pressed
if event.type == pg.KEYUP:
if event.key == pg.K_LEFT or event.key == pg.K_RIGHT:
Robot.acc.x = Robot.acc.x * Robot_friction
#Adjusts velocity of robot by adding the acceleration on each cycle
Robot.vel = Robot.vel+ Robot.acc
#gameDisplay.fill(sky)
gameDisplay.blit(backgroundImg,(0,0))
#Changes Robot position according to its velocity,acceleration and the friction
Robot.RobotPos = Robot.RobotPos + Robot.vel + 0.5 * Robot.acc
#Loads robot onto screen
gameDisplay.blit(robotImg,(Robot.rect))
#pg.draw.rect(gameDisplay, red, Robot.rect, 2
display_lives(lives)
display_score(score)#lives
#Sets bottom of robot to its position
Robot.rect.midbottom = Robot.RobotPos
#Collision detection
if Robot.vel.y > 0:
hits = pg.sprite.spritecollide(Robot , platforms, False)
if hits:
if Robot.RobotPos.y < hits[0].rect.bottom:
#Puts Robot on top of platform
Robot.RobotPos.y = hits[0].rect.top + 1
Robot.vel.y = 0
hit = pg.sprite.spritecollide(Robot , wall,False)
if hit:
if left == True:
Robot.vel.x = 0
Robot.acc.x = 0
else:
pass
#Scrolling
if offset > 0:
pass
elif Robot.rect.left < display_width/4:
Robot.RobotPos.x = Robot.RobotPos.x + abs(Robot.vel.x)
startX = startX + int(abs(Robot.vel.x))
offset = offset + int(abs(Robot.vel.x))
for plat in platforms:
plat.rect.x = plat.rect.x + int(abs(Robot.vel.x))
if Robot.rect.right > (display_width-display_width/4):
Robot.RobotPos.x = Robot.RobotPos.x - abs(Robot.vel.x)
startX = startX - int(abs(Robot.vel.x))
offset = offset - int(abs(Robot.vel.x))
for plat in platforms:
plat.rect.x = plat.rect.x - int(abs(Robot.vel.x))
draw()
#Losing a life
if Robot.rect.top > display_height:
lives = lives - 1
Robot.RobotPos.y = Robot.RobotPos.y - (40+Robot_height)
Robot.RobotPos.x = Robot.RobotPos.x - 200
Robot.vel.x = 0
#Sets top velocity of robot
if Robot.vel.x > 6:
Robot.vel.x = 6
if Robot.vel.x < -6:
Robot.vel.x = -6
#Makes robot velocity = 0 when it is close to 0
if Robot.vel.x < 0.05 and Robot.vel.x > -0.05:
Robot.acc.x = 0
Robot.vel.x = 0
pg.display.update()#Updates display
clock.tick(60)
game_intro()
pg.quit()
quit()