滚动限制
Scrolling limit
我目前正在上 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()
我设法自己完成了这个问题,所以我将简要说明我所做的。
我添加了一个名为 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 。
当偏移量小于零时,这只会使滚动部分脱离代码。任何大于零的值都表示屏幕已向左偏移。因此,此代码仅允许您在不在屏幕边缘时滚动
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
这是我所有的代码,以防我遗漏任何内容或者您想要查看不同的部分。
*edit 此代码当前不滚动或显示墙。滚动并不重要,因为机器人在滚动时应该在屏幕中间,所以墙仍然在那里但是没有办法与之碰撞并且它是不可见的所以你看不到它
如果我没有很好地解释某个部分或者您只是想了解更多信息,请随时提问。
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()
我目前正在上 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()
我设法自己完成了这个问题,所以我将简要说明我所做的。
我添加了一个名为 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 。 当偏移量小于零时,这只会使滚动部分脱离代码。任何大于零的值都表示屏幕已向左偏移。因此,此代码仅允许您在不在屏幕边缘时滚动
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
这是我所有的代码,以防我遗漏任何内容或者您想要查看不同的部分。
*edit 此代码当前不滚动或显示墙。滚动并不重要,因为机器人在滚动时应该在屏幕中间,所以墙仍然在那里但是没有办法与之碰撞并且它是不可见的所以你看不到它
如果我没有很好地解释某个部分或者您只是想了解更多信息,请随时提问。
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()