2017-04-24 55 views
0

我目前正在參加一個A級計算機科學課程,我必須爲一個項目創建一個遊戲。我知道這段代碼可能效率不高,但我試圖將它保留在我自己的工作中,並希望有一個兩位的手,我有點卡住了滾動限制

此代碼當前以介紹屏幕開始,並且一次在遊戲,向左滾動,向右滾動,當玩家脫離屏幕時移除生命。當所有的生命都失敗時,屏幕上會顯示一個遊戲

我想知道是否有辦法設置滾動屏幕的限制,以便當玩家離開時停止在特定點滾動並停止屏幕邊緣的玩家阻止它們脫落。我想設置最左邊的底部平臺,爲邊緣,這迫使玩家向右走

另一個小一個是,如果有什麼辦法可以減少滯後

如果沒有了你需要的信息爲了幫助隨意問 任何建議,將不勝感激 感謝所有幫助

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

提問時,一定要問一個問題。這縮小了答案,使問題更易於理解並增加了其他用戶的可搜索性。在你的問題中還包括[mcve](如果有必要),而不是你的代碼,因爲太多的代碼需要閱讀SO問題。正如我在你之前的問題中所寫的那樣;請遵循命名約定,否則讀取和理解代碼將變得更加困難,因爲不清楚單獨名稱中的變量,類,函數或常量是什麼,這意味着我們必須在每次遇到它時查找它的定義位置。 –

+0

In [this](http://stackoverflow.com/a/14357169/6486738)所以回答你會找到你要找的東西(爲你的第一個子問題)。 –

+0

爲了減少延遲,確保每循環只畫一次屏幕。在你正在繪製的遊戲循環中(使用你的'draw()'函數),然後在檢查滾動('如果Robot.rect.left

回答

0

我完成了這個問題自己,所以我會簡單介紹一下我做了什麼。

我添加了一個名爲off set的變量,它跟蹤了滾動屏幕距原始位置有多遠。

offset = 0 

我加入這個變量到我的滾動碼

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

然後我增加了額外的,如果這個功能。 當偏移量小於零時,這隻會從代碼中運行滾動部分。任何大於零的值都表示屏幕已向左偏移。因此,該代碼只允許時,你是不是在屏幕的邊緣滾動

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

然後,爲了從掉下屏幕上的停止雪碧我用我的平臺功能在邊緣加一堵牆,並將其添加到以防萬一我需要以後使用更多的牆。

w1 = Platform(0,0,10,display_height) 
wall = pg.sprite.Group() 
wall.add(w1) 

在此之後我用spritecollide檢查精靈是否被摸牆

hit = pg.sprite.spritecollide(Robot , wall,False) 
     if hit: 
      Robot.vel.x = 0 
      Robot.acc.x = 0 

雖然這個工作沒有成爲一個問題,這是很難的精靈遠離移動創造了條件壁由於其速度被不斷地被設定爲0,所以我說,如果被按壓左箭頭

hit = pg.sprite.spritecollide(Robot , wall,False) 
     if hit: 
      if left == True: 
       Robot.vel.x = 0 
       Robot.acc.x = 0 

這於是只復位,檢查另一個變量值如果您一起試圖向左移動

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 

這是我所有代碼的情況下,我錯過了什麼出來或有你想看看不同的部分。

*編輯此代碼目前不滾動或顯示牆。滾動並不重要,因爲機器人在滾動時應該位於屏幕中間,因此牆壁仍然會在那裏,但無法與其相撞,因此您無法看到它。

如果我沒有很好地解釋某個部分,或者您只是想了解更多信息,請隨時提問。

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