0

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'
Evoxey
  • 1

0 Answers0