Over View
I am at a stage where I want to add a couple of 'Extra' menus to my game. I am starting this off by creating the pause menu and plan to use the same concept to create a 'Shop' and 'Player creation' as well as a 'Mini Game'.
Problem
So far I have the idea of a menu, but it stop if the mouse moves, and I am not sure if it continues when continue is pressed.
Code
Here is my code: import pygame, random, time pygame.init()
#Screen
SIZE = width, height = 1280, 720 #Make sure background image is same size
SCREEN = pygame.display.set_mode(SIZE)
pygame.display.set_caption("Cube")
#Events
done = False
menu_on = True
game_start = False
pause = False
#Colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREY = (51,51,51)
YELLOW = (255, 255, 153)
PURPLE = (153, 102, 255)
RED = (255, 0 ,0)
GREEN = (0, 255, 0)
#Fonts
FONT = pygame.font.SysFont("Trebuchet MS", 25)
FONT_2 = pygame.font.SysFont("Trebuchet MS", 40)
MENU_FONT = (FONT_2)
FONT_HUD = pygame.font.SysFont("Trebuchet MS", 40)
#Info
time = 0
minute = 0
hour = 0
day = 0
year = 0
counter = 0
blink_clock = 0
blink = 0
hunger = 100
fun = 100
health = 100
feeling = 3
#Hunger
HUNGERFONT = FONT_HUD.render("Hunger:{0:03}".format(hunger),1, BLACK) #zero-pad day to 3 digits
HUNGERFONTR=HUNGERFONT.get_rect()
HUNGERFONTR.center=(886, 625)
HUNGERFONT_R = FONT_HUD.render("Hunger:{0:03}".format(hunger),1, RED) #zero-pad day to 3 digits
HUNGERFONT_RR=HUNGERFONT_R.get_rect()
HUNGERFONT_RR.center=(885, 625)
HUNGERFONT_G = FONT_HUD.render("Hunger:{0:03}".format(hunger),1, GREEN) #zero-pad day to 3 digits
HUNGERFONT_GR=HUNGERFONT_G.get_rect()
HUNGERFONT_GR.center=(885, 625)
#Fun
FUNFONT = FONT_HUD.render("Fun:{0:03}".format(fun),1, BLACK) #zero-pad day to 3 digits
FUNFONTR=FUNFONT.get_rect()
FUNFONTR.center=(626, 625)
FUNFONT_R = FONT_HUD.render("Fun:{0:03}".format(fun),1, RED) #zero-pad day to 3 digits
FUNFONT_RR=FUNFONT_R.get_rect()
FUNFONT_RR.center=(625, 625)
FUNFONT_G = FONT_HUD.render("Fun:{0:03}".format(fun),1, GREEN) #zero-pad day to 3 digits
FUNFONT_GR=FUNFONT_G.get_rect()
FUNFONT_GR.center=(625, 625)
#Health
HEALTHFONT = FONT_HUD.render("Health:{0:03}".format(health),1, BLACK) #zero-pad day to 3 digits
HEALTHFONTR=HEALTHFONT.get_rect()
HEALTHFONTR.center=(366, 625)
HEALTHFONT_R = FONT_HUD.render("Health:{0:03}".format(health),1, RED) #zero-pad day to 3 digits
HEALTHFONT_RR=HEALTHFONT_R.get_rect()
HEALTHFONT_RR.center=(365, 625)
HEALTHFONT_G = FONT_HUD.render("Health:{0:03}".format(health),1, GREEN) #zero-pad day to 3 digits
HEALTHFONT_GR=HEALTHFONT_G.get_rect()
HEALTHFONT_GR.center=(365, 625)
#Year
YEARFONT = FONT.render("Year:{0:03}".format(year),1, BLACK) #zero-pad day to 3 digits
YEARFONTR=YEARFONT.get_rect()
YEARFONTR.center=(885, 20)
#Day
DAYFONT = FONT.render("Day:{0:03}".format(day),1, BLACK) #zero-pad day to 3 digits
DAYFONTR=DAYFONT.get_rect()
DAYFONTR.center=(985, 20)
#Hour
HOURFONT = FONT.render("Hour:{0:02}".format(hour),1, BLACK) #zero-pad hours to 2 digits
HOURFONTR=HOURFONT.get_rect()
HOURFONTR.center=(1085, 20)
#Minute
MINUTEFONT = FONT.render("Minute:{0:02}".format(minute),1, BLACK) #zero-pad minutes to 2 digits
MINUTEFONTR=MINUTEFONT.get_rect()
MINUTEFONTR.center=(1200, 20)
#Characters
def load_image(cube):
image = pygame.image.load(cube)
return image
class Menu:
hovered = False
def __init__(self, text, pos):
self.text = text
self.pos = pos
self.set_rect()
self.draw()
def draw(self):
self.set_rend()
SCREEN.blit(self.rend, self.rect)
def set_rend(self):
self.rend = MENU_FONT.render(self.text, 1, self.get_color())
def get_color(self):
if self.hovered:
return (PURPLE)
else:
return (YELLOW)
def set_rect(self):
self.set_rend()
self.rect = self.rend.get_rect()
self.rect.topleft = self.pos
class Cube_black(pygame.sprite.Sprite):
def __init__(self):
super(Cube_black, self).__init__()
self.images = []
self.images.append(load_image('Cube_black.png'))
self.index = 0
self.image = self.images[self.index]
self.rect = pygame.Rect(440, 180, 74, 160)
def update(self):
self.index += 1
if self.index >= len(self.images):
self.index = 0
self.image = self.images[self.index]
class Eye_black(pygame.sprite.Sprite):
def __init__(self):
super(Eye_black, self).__init__()
self.images = []
self.images.append(load_image('Eye_grey.png'))
self.index = 0
self.image = self.images[self.index]
self.rect = pygame.Rect(440, 180, 74, 160)
def update(self):
self.index += 1
if self.index >= len(self.images):
self.index = 0
self.image = self.images[self.index]
class Mood_good(pygame.sprite.Sprite):
def __init__(self):
super(Mood_good, self).__init__()
self.images = []
self.images.append(load_image('Good.png'))
self.index = 0
self.image = self.images[self.index]
self.rect = pygame.Rect(440, 180, 74, 160)
def update(self):
self.index += 1
if self.index >= len(self.images):
self.index = 0
self.image = self.images[self.index]
class Mood_fine(pygame.sprite.Sprite):
def __init__(self):
super(Mood_fine, self).__init__()
self.images = []
self.images.append(load_image('Fine.png'))
self.index = 0
self.image = self.images[self.index]
self.rect = pygame.Rect(440, 180, 74, 160)
def update(self):
self.index += 1
if self.index >= len(self.images):
self.index = 0
self.image = self.images[self.index]
class Blink(pygame.sprite.Sprite):
def __init__(self):
super(Blink, self).__init__()
self.images = []
self.images.append(load_image('Blink.png'))
self.index = 0
self.image = self.images[self.index]
self.rect = pygame.Rect(440, 180, 74, 160)
def update(self):
self.index += 1
if self.index >= len(self.images):
self.index = 0
self.image = self.images[self.index]
class Blank(pygame.sprite.Sprite):
def __init__(self):
super(Blank, self).__init__()
self.images = []
self.images.append(load_image('Blank.png'))
self.index = 0
self.image = self.images[self.index]
self.rect = pygame.Rect(440, 180, 74, 160)
def update(self):
self.index += 1
if self.index >= len(self.images):
self.index = 0
self.image = self.images[self.index]
cube_color = Cube_black()
cube = pygame.sprite.Group(cube_color)
eye_color = Eye_black()
eye = pygame.sprite.Group(eye_color)
mood_feeling_g = Mood_good()
mood_good = pygame.sprite.Group(mood_feeling_g)
mood_feeling_f = Mood_fine()
mood_fine = pygame.sprite.Group(mood_feeling_f)
blink = Blink()
blinking = pygame.sprite.Group(blink)
blankcube = Blank()
blankgroup = pygame.sprite.Group(blankcube)
start_game = [Menu("START GAME", (140, 105))]
help_ = [Menu("HELP", (140, 155))]
quit_ = [Menu("QUIT", (140, 205))]
pause = [Menu("PAUSE GAME", (140, 105))]
continue_game = [Menu("CONTINUE", (140, 55))]
#Game Speed
clock = pygame.time.Clock()
FPS = 60
CLOCKTICK = pygame.USEREVENT+1
pygame.time.set_timer(CLOCKTICK, 1000)
SCREEN.fill(WHITE)
while not done:
if pause == False:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_p:
pause = True
if menu_on == True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
SCREEN.fill(GREY)
for Menu in help_:
if Menu.rect.collidepoint(pygame.mouse.get_pos()):
Menu.hovered = True
else:
Menu.hovered = False
Menu.draw()
for Menu in quit_:
if Menu.rect.collidepoint(pygame.mouse.get_pos()):
Menu.hovered = True
if event.type == pygame.MOUSEBUTTONDOWN:
done = True
else:
Menu.hovered = False
Menu.draw()
for Menu in start_game:
if Menu.rect.collidepoint(pygame.mouse.get_pos()):
Menu.hovered = True
if event.type == pygame.MOUSEBUTTONDOWN:
game_start = True
else:
Menu.hovered = False
Menu.draw()
cube.update()
cube.draw(SCREEN)
eye.update()
eye.draw(SCREEN)
mood_good.update()
mood_good.draw(SCREEN)
if blink == 1:
blinking.update()
blinking.draw(SCREEN)
if event.type == CLOCKTICK:
blink_clock = blink_clock + 1
if blink_clock == 1:
blink_clock = 0
blink = random.randint(0, 1)
if blink == 1:
blinking.update()
blinking.draw(SCREEN)
if blink_clock == 1:
blink = 0
blankgroup.update()
blankgroup.draw(SCREEN)
if pause == True:
game_start == False
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
SCREEN.fill(GREY)
for Menu in help_:
if Menu.rect.collidepoint(pygame.mouse.get_pos()):
Menu.hovered = True
else:
Menu.hovered = False
Menu.draw()
for Menu in quit_:
if Menu.rect.collidepoint(pygame.mouse.get_pos()):
Menu.hovered = True
if event.type == pygame.MOUSEBUTTONDOWN:
done = True
else:
Menu.hovered = False
Menu.draw()
for Menu in continue_game:
if Menu.rect.collidepoint(pygame.mouse.get_pos()):
Menu.hovered = True
if event.type == pygame.MOUSEBUTTONDOWN:
game_start = True
else:
Menu.hovered = False
Menu.draw()
cube.update()
cube.draw(SCREEN)
eye.update()
eye.draw(SCREEN)
mood_good.update()
mood_good.draw(SCREEN)
if blink == 1:
blinking.update()
blinking.draw(SCREEN)
if event.type == CLOCKTICK:
blink_clock = blink_clock + 1
if blink_clock == 1:
blink_clock = 0
blink = random.randint(0, 1)
if blink == 1:
blinking.update()
blinking.draw(SCREEN)
if blink_clock == 1:
blink = 0
blankgroup.update()
blankgroup.draw(SCREEN)
if game_start == True:
menu_on = False
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_p:
pause = True
else: pause = False
if event.type == pygame.QUIT:
done = True
elif event.type == CLOCKTICK:
minute = minute + 1
if minute == 60:
hour = hour + 1
minute = 0
if minute < 60:
if hunger > 0:
hunger = hunger - 2
else: hunger = hunger
if fun > 0:
fun = fun - 2
else: fun = fun
if health > 0:
health = health - 1
else: health = health
if hour == 24:
day = day + 1
hour = 0
if day == 365:
year = year + 1
day = 0
blink_clock = blink_clock + 1
if blink_clock == 1:
blink_clock = 0
blink = random.randint(0, 1)
if blink_clock == 1:
blink = 0
SCREEN.fill(WHITE)
cube.update()
cube.draw(SCREEN)
eye.update()
eye.draw(SCREEN)
if feeling >= 4:
mood_good.update()
mood_good.draw(SCREEN)
if feeling == 3 :
mood_fine.update()
mood_fine.draw(SCREEN)
if blink == 1:
blinking.update()
blinking.draw(SCREEN)
blankgroup.update()
blankgroup.draw(SCREEN)
MINUTEFONT = FONT.render("Minute:{0:02}".format(minute), 1, BLACK)
SCREEN.blit(MINUTEFONT, MINUTEFONTR)
HOURFONT = FONT.render("Hour:{0:02}".format(hour), 1, BLACK)
SCREEN.blit(HOURFONT, HOURFONTR)
DAYFONT = FONT.render("Day:{0:03}".format(day), 1, BLACK)
SCREEN.blit(DAYFONT, DAYFONTR)
YEARFONT = FONT.render("Year:{0:03}".format(year), 1, BLACK)
SCREEN.blit(YEARFONT, YEARFONTR)
#Hunger
HUNGERFONT = FONT_HUD.render("Hunger:{0:03}".format(hunger),1, BLACK)
SCREEN.blit(HUNGERFONT, HUNGERFONTR)
if hunger >= 75:
HUNGERFONT_G = FONT_HUD.render("Hunger:{0:03}".format(hunger),1, GREEN)
SCREEN.blit(HUNGERFONT_G, HUNGERFONT_RR)
feeling = feeling + 1
if hunger <= 25:
HUNGERFONT_R = FONT_HUD.render("Hunger:{0:03}".format(hunger),1, RED)
SCREEN.blit(HUNGERFONT_R, HUNGERFONT_GR)
feeling = feeling - 1
if hunger == 74:
feeling = feeling -1
#Fun
FUNFONT = FONT_HUD.render("Fun:{0:03}".format(fun),1, BLACK)
SCREEN.blit(FUNFONT, FUNFONTR)
if fun >= 75:
FUNFONT_G = FONT_HUD.render("Fun:{0:03}".format(fun),1, GREEN)
SCREEN.blit(FUNFONT_G, FUNFONT_RR)
feeling = feeling + 1
if fun <= 25:
FUNFONT_R = FONT_HUD.render("Fun:{0:03}".format(fun),1, RED)
SCREEN.blit(FUNFONT_R, FUNFONT_GR)
if fun == 74:
feeling = feeling -1
#Health
HEALTHFONT = FONT_HUD.render("Health:{0:03}".format(health),1, BLACK)
SCREEN.blit(HEALTHFONT, HEALTHFONTR)
if health >= 75:
HEALTHFONT_G = FONT_HUD.render("Health:{0:03}".format(health),1, GREEN)
SCREEN.blit(HEALTHFONT_G, HEALTHFONT_RR)
feeling = feeling + 1
if health <= 25:
HEALTHFONT_R = FONT_HUD.render("Health:{0:03}".format(health),1, RED)
SCREEN.blit(HEALTHFONT_R, HEALTHFONT_GR)
feeling = feeling - 1
if health == 74:
feeling = feeling -1
print(event)
clock.tick(FPS)
pygame.display.flip()
pygame.quit()
The pause should occur from an event.
You want it by a keypress 'P', right?
paused = False
while game_loop:
for event in pygame.event.get():
if event.type==KEYDOWN:
if event.key=='P':
paused = not paused
//other events
if paused:
//draw pause menu here
pause() //This function will have its own pause loop running until
//you select an item in the pause menu
//and will set paused = not paused on exit
else:
//draw main game here
This is how you can do it by adding to the main event queue. Always add events in that.
You can check this snake game, too. It has the pause menu in it. Press ESC key for that !
EDIT: Sorry, I didnt provide any link for the snake game. https://github.com/sk364/fun-snake-attack/blob/master/game.py#L508
You can then create a pause menu which will have its own event loop
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.