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