简体   繁体   中英

Pygame - Menu Screen Buttons not working properly

I am trying to create a menu screen for my game. At the moment im using sprites for buttons and everything works well, and I can create an infinite amount of buttons (currently I just have Start and Options), but only the first button I call appears on the screen. I think it has something to do with the while loop in the button class but I am not sure on how to fix it. I am probably making no sense here so if you need me to clarify anything I will. Thanks!

import pygame
import random
import time

pygame.init()

#colours
white = (255,255,255)
black = (0,0,0)
red = (255,0,0)
green = (0,155,0)
blue = (50,50,155)

display_width = 800  
display_height = 600 

gameDisplay = pygame.display.set_mode((display_width,display_height)) 
pygame.display.set_caption('Numeracy Ninjas')

clock = pygame.time.Clock()

img_button_start = pygame.image.load('Sprites/Buttons/button_start.png')
img_button_options = pygame.image.load('Sprites/Buttons/button_options.png')

gameDisplay.fill(white)

class Button(pygame.sprite.Sprite):
    def __init__(self, sprite, buttonX, buttonY):
        super().__init__()

        gameDisplay.blit(sprite, (buttonX, buttonY))

        pygame.display.update()

        running = True
        while (running):
            for event in pygame.event.get():
                if event.type == pygame.MOUSEBUTTONDOWN:
                    # Set the x, y postions of the mouse click
                    x, y = event.pos
                    print(x, y)
                    if x <= (150 + buttonX) and x >=(0 + buttonX) and y <= (75 + buttonY) and y >= (0 + buttonY):
                        print('clicked on button')

def gameIntro():                   
    button_start = Button(img_button_start, 27, 0)
    button_options = Button(img_button_options, 27, 500)

gameIntro()

In the constructor of your Button class, you have an infinite loop. This means you never get to the code part where you make your second Button.

def gameIntro():                   
    button_start = Button(img_button_start, 27, 0) #stuck in infinite loop
    print('This print statement is never reached')
    button_options = Button(img_button_options, 27, 500)

Instead, what you want to do is initialize two Buttons, and then have a main game loop in your gameIntro() method that checks for events. If a mousebuttondown event occured, you want to pass the event (or even just the event position, if you don't care which mouse button was clicked) to a function of button that checks whether this instance of button was clicked and then handles the input (possibly by returning something which you handle in the main game loop).

Note that I haven't run the following code, I'm just trying to give you an idea how it should be structured:

class Button(pygame.sprite.Sprite):
    def __init__(self, image, buttonX, buttonY):
        super().__init__()
        self.image = image
        self.rect = image.getRect()
        self.rect.x = buttonX
        self.rect.y = buttonY

    def wasClicked(event):
        if self.rect.collidepoint(event.pos):
             return True

def gameIntro():
    #initialize buttons
    buttons = pygame.sprite.Group() #make a group to make drawing easier
    button_start = Button(img_button_start, 27, 0)
    button_options = Button(img_button_options, 27, 500)
    #draw buttons to display
    buttons.draw(gameDisplay)
    pygame.display.update()

    #main game loop
    running = True
    while (running):
        for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONDOWN:
                #check for every button whether it was clicked
                for btn in buttons:
                    if btn.wasClicked():
                        #do something appropriate
            if event.type == pygame.QUIT:
                pygame.quit()

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM