Estoy continuamente la repetición de código, y se pregunta si hay una manera de simplificar estas declaraciones

0

Pregunta

El código que he creado se utiliza en pygame para resaltar los botones que estoy flotando por encima y cuando se hace clic en activará su correspondiente función

if singleplayer_button.collidepoint(mx, my):
    pygame.draw.rect(WIN, (180, 0, 0), singleplayer_button)
    WIN.blit(singleplayer_button_text, (295, 400))
    if click:
        singleplayer()
else:
    pygame.draw.rect(WIN, RED, singleplayer_button)
    WIN.blit(singleplayer_button_text, (295, 400))

if multiplayer_button.collidepoint(mx, my):
    pygame.draw.rect(WIN, (180, 0, 0), multiplayer_button)
    WIN.blit(multiplayer_button_text, (727, 400))
    if click:
        multiplayer1()
else:
    pygame.draw.rect(WIN, RED, multiplayer_button)
    WIN.blit(multiplayer_button_text, (727, 400))

if leaderboard_button.collidepoint(mx, my):
    pygame.draw.rect(WIN, (180, 0, 0), leaderboard_button)
    WIN.blit(leaderboard_button_text, (291, 550))
    if click:
        leaderboard()
else:
    pygame.draw.rect(WIN, RED, leaderboard_button)
    WIN.blit(leaderboard_button_text, (291, 550))

if credit_button.collidepoint(mx, my):
    pygame.draw.rect(WIN, (180, 0, 0), credit_button)
    WIN.blit(credits_button_text, (774, 550))
    if click:
        credit()
else:
    pygame.draw.rect(WIN, RED, credit_button)
    WIN.blit(credits_button_text, (774, 550))

if register_button.collidepoint(mx, my):
    pygame.draw.rect(WIN, (180, 0, 0), register_button)
    WIN.blit(register_button_text, (300, 700))
    if click:
        register()
else:
    pygame.draw.rect(WIN, RED, register_button)
    WIN.blit(register_button_text, (300, 700))

if exit_button.collidepoint(mx, my):
    pygame.draw.rect(WIN, (180, 0, 0), exit_button)
    WIN.blit(exit_button_text, (737, 700))
    if click:
        exit_window()
else:
    pygame.draw.rect(WIN, RED, exit_button)
    WIN.blit(exit_button_text, (737, 700))

####_button es un rectángulo

####_button_text es el texto que se presenta blitted en la parte superior del rectángulo

pygame python
2021-11-23 17:15:29
1

Mejor respuesta

3

Leer un combate de Clases.

Crear un Button clase:

class Button():
    def __init__(self, rect, text, action):
        self.rect = rect
        self.text = text
        self.action = action
    def draw(self, win):
        pygame.draw.rect(win, (180, 0, 0), self.rect)
        WIN.blit(self.text, self.text.get_rect(center = self.rect.center))
    def click(self, mx, my, click):
        if self.rect.collidepoint(mx, my) and click:
            self.action()

Crear una lista de Botton objetos:

buttons = [
    Button(singleplayer_button, singleplayer_button_text, singleplayer),
    Button(multiplayer_button,  multiplayer_button_text,  multiplayer1),
    Button(leaderboard_button,  leaderboard_button_text,  leaderboard),
    Button(credit_button,       credits_button_text,      credit),
    Button(register_button,     register_button_text,     register),
    Button(exit_button,         exit_button_text,         exit_window)
]

Dibujar los botones en un bucle:

for button in buttons:
    button.draw(WIN)

Hacer clic en la detección de un bucle:

for button in buttons:
    button.click(mx, my, click)
2021-11-23 19:01:17

Gracias por la solución, si yo pudiera upvote esto quisiera.
Minhaj Rahman

@MinhajRahman Gracias. Eres bienvenido.
Rabbid76

Yo sólo quería seguir en esto. Me llega mensaje de error al intentar ejecutar el código de la línea 147, en el sorteo para GANAR.blit(auto.de texto, auto.texto.get_rect(centro=auto.rect.centro)) AttributeError: 'pygame.Rect' el objeto no tiene ningún atributo 'get_rect'
Minhaj Rahman

@MinhajRahman lo Siento, mi mal. Hubo un error en la respuesta. Button(register_button, register_button_text, register), en lugar de Button(register_button, register_button, register), (el 2º argumento es register_button_text).
Rabbid76

Mismo para Button(exit_button, exit_button_text, exit_window).
Rabbid76

Ahhhh he estado tratando de averiguar esto por un tiempo y ahora ni siquiera lo nota, gracias de nuevo
Minhaj Rahman

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................