I'm making a game and can't get the buttons on the menu within the main game to work once escape is pressed. The buttons on the main menu work before the main game is started, but don't once the game has run.
I tried moving about the buttons to make sure they do not overlap, but I have no clue what to do from here.
import pygame
import sys
from pygame.locals import *
pygame.init()
class Tile(pygame.sprite.Sprite):
def __init__(self, pos, size):
super().__init__()
self.image = pygame.Surface((size, size))
self.image.fill('white')
self.rect = self.image.get_rect(topleft = pos)
def update(self, y_shift):
self.rect.y += y_shift
class SpikeUp(pygame.sprite.Sprite):
def __init__(self, pos, size):
super().__init__()
self.image = pygame.Surface((size, size))
self.image.fill('blue')
self.rect = self.image.get_rect(topleft = pos)
def update(self, y_shift):
self.rect.y += y_shift
class SpikeDown(pygame.sprite.Sprite):
def __init__(self, pos, size):
super().__init__()
self.image = pygame.Surface((size, size))
self.image.fill('blue')
self.rect = self.image.get_rect(topleft = pos)
def update(self, y_shift):
self.rect.y += y_shift
class SpikeLeft(pygame.sprite.Sprite):
def __init__(self, pos, size):
super().__init__()
self.image = pygame.Surface((size, size))
self.image.fill('blue')
self.rect = self.image.get_rect(topleft = pos)
def update(self, y_shift):
self.rect.y += y_shift
class SpikeRight(pygame.sprite.Sprite):
def __init__(self, pos, size):
super().__init__()
self.image = pygame.Surface((size, size))
self.image.fill('blue')
self.rect = self.image.get_rect(topleft = pos)
def update(self, y_shift):
self.rect.y += y_shift
class Collectible(pygame.sprite.Sprite):
def __init__(self, pos, size):
super().__init__()
self.image = pygame.Surface((size, size))
self.image.fill('green')
self.rect = self.image.get_rect(topleft = pos)
def update(self, y_shift):
self.rect.y += y_shift
class Player(pygame.sprite.Sprite):
def __init__(self, pos):
super().__init__()
self.image = pygame.Surface((32, 64))
self.image.fill('red')
self.rect = self.image.get_rect(topleft = pos)
self.direction = pygame.math.Vector2(0, 0)
self.speed = 7.5
self.gravity = 0.1
self.jump_speed = -1
self.isJump = False
self.alive = True
def movement(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_d] and keys[pygame.K_LSHIFT]:
self.direction.x = 5
elif keys[pygame.K_a] and keys[pygame.K_LSHIFT]:
self.direction.x = -5
elif keys[pygame.K_d]:
self.direction.x = 1
elif keys[pygame.K_a]:
self.direction.x = -1
else:
self.direction.x = 0
if keys[pygame.K_SPACE] or keys[K_w]:
self.jump()
def jump(self):
if self.colliding:
self.direction.y = -2
self.colliding = False
def grav(self):
self.direction.y += self.gravity
self.rect.y += self.direction.y
def update(self):
self.movement()
self.grav()
class Button():
def __init__(self, x, y, image, scale):
width = image.get_width()
height = image.get_height()
self.image = pygame.transform.scale(image, (int(width * scale), int(height * scale)))
self.rect = self.image.get_rect()
self.rect.topleft = (x,y)
self.clicked = False
def draw(self, surface):
action = False
#get mouse position
pos = pygame.mouse.get_pos()
#check mouseover and clicked conditions
if self.rect.collidepoint(pos):
if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False:
self.clicked = True
action = True
if pygame.mouse.get_pressed()[0] == 0:
self.clicked = False
#draw button on screen
surface.blit(self.image, (self.rect.x, self.rect.y))
return action
class World:
def __init__(self, game_map, surface):
self.display_surface = surface
self.setup_world(game_map)
self.world_shift = 0
def setup_world(self, game_map):
self.tiles = pygame.sprite.Group()
self.collectibles = pygame.sprite.Group()
self.player = pygame.sprite.GroupSingle()
self.spikes = pygame.sprite.Group()
for row_num, row in enumerate(game_map):
for column_num, block in enumerate(row):
x = column_num * tile_size
y = row_num * tile_size
if block == 'X':
tile = Tile((x, y), tile_size)
self.tiles.add(tile)
if block == 'C':
tile = Collectible((x, y), tile_size)
self.collectibles.add(tile)
if block == 'P':
tile = Player((x, y))
self.player.add(tile)
if block == 'U':
tile = SpikeUp((x, y), tile_size)
self.spikes.add(tile)
if block == 'D':
tile = SpikeDown((x, y), tile_size)
self.spikes.add(tile)
if block == 'L':
tile = SpikeLeft((x, y), tile_size)
self.spikes.add(tile)
if block == 'R':
tile = SpikeRight((x, y), tile_size)
self.spikes.add(tile)
def scroll_y(self):
player = self.player.sprite
player_y = player.rect.centery
direction_y = player.direction.y
if player_y < 200 and direction_y < 0:
self.world_shift = 7.5
player.speed = 0
elif player_y > 600 and direction_y > 0:
self.world_shift = -7.5
player.speed = 0
else:
self.world_shift = 0
player.speed = 7.5
def h_move_collision(self):
player = self.player.sprite
player.rect.x += player.direction.x * player.speed
for sprite in self.tiles.sprites():
if sprite.rect.colliderect(player.rect):
if player.direction.x < 0:
player.rect.left = sprite.rect.right
elif player.direction.x > 0:
player.rect.right = sprite.rect.left
def v_move_collision(self):
player = self.player.sprite
player.rect.y += player.direction.y * player.speed
for sprite in self.tiles.sprites():
if sprite.rect.colliderect(player.rect):
if player.direction.y > 0:
player.direction.y = 0
player.rect.bottom = sprite.rect.top
player.colliding = True
elif player.direction.y < 0:
player.rect.top = sprite.rect.bottom
player.direction.y = 0
def spike_collision(self):
player = self.player.sprite
for sprite in self.spikes.sprites():
if sprite.rect.colliderect(player.rect):
print("Death")
player.alive = False
def collectible_collision(self):
player = self.player.sprite
for sprite in self.collectibles.sprites():
if sprite.rect.colliderect(player.rect):
print("Collected")
def run(self):
screen.fill('black')
#level
self.tiles.update(self.world_shift)
self.tiles.draw(self.display_surface)
self.collectibles.update(self.world_shift)
self.collectibles.draw(self.display_surface)
self.spikes.update(self.world_shift)
self.spikes.draw(self.display_surface)
self.scroll_y()
#player
self.h_move_collision()
self.v_move_collision()
self.spike_collision()
self.collectible_collision()
self.player.update()
self.player.draw(self.display_surface)
pygame.display.update()
font = pygame.font.SysFont("arialblack", 40)
tile_size = 64
game_map = ['----------------',
'----------------',
'----------------',
'----------------',
'----------------',
'----------------',
'----------------',
'----------------',
'----------------',
'----------------',
'----------------',
'----------------',
'----------------',
'---------------',
'----------------',
'--P-U-D-L-R-C-X-',
'XXXXXXXXXXXXXXXX',
'XXXXXXXXXXXXXXXX',
'XXXXXXXXXXXXXXXX',
'XXXXXXXXXXXXXXXX',
'XXXXXXXXXXXXXXXX'
]
screen_width = len(game_map[0]) * tile_size
screen_height = 800
screen = pygame.display.set_mode((screen_width, screen_height))
clock = pygame.time.Clock()
world = World(game_map, screen)
resume_img = pygame.image.load("button_resume.png").convert_alpha()
quit_img = pygame.image.load("button_quit.png").convert_alpha()
play_img = pygame.image.load('button_play.png').convert_alpha()
resume_button = Button(250, screen_height/2, resume_img, 1)
quit_button = Button(screen_width - 350, screen_height/2, quit_img, 1)
play_button = Button(250, screen_height/2, play_img, 1)
state = 'starting'
keys = pygame.key.get_pressed()
run = True
while run == True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
clock.tick(60)
if state == 'starting':
if play_button.draw(screen):
print('play clicked')
state = 'main'
screen.fill('black')
if quit_button.draw(screen):
pygame.quit()
sys.exit()
if state == 'main':
world.run()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
state = 'menu'
screen.fill('black')
if quit_button.draw(screen):
print('quit pressed')
pygame.quit()
sys.exit()
if resume_button.draw(screen):
print('resume pressed')
state = 'main'