Search code examples
pythonpygamehorizontal-scrollinglag

Scrolling limit


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()

Solution

  • 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()