¿Cómo hacer botones en python / pygame?

Estoy haciendo un juego en pygame y en la primera pantalla quiero que haya botones que puedes presionar para (i) iniciar el juego, (ii) cargar una nueva pantalla con instrucciones y (iii) salir del progtwig.

He encontrado este código en línea para hacer botones, pero realmente no lo entiendo (no soy tan bueno en progtwigción orientada a objetos). Si pudiera obtener alguna explicación sobre lo que está haciendo, sería genial. Además, cuando lo uso e bash abrir un archivo en mi computadora usando la ruta del archivo, aparece el error sh: filepath: Permiso denegado, que no sé cómo resolver.

#load_image is used in most pygame programs for loading images def load_image(name, colorkey=None): fullname = os.path.join('data', name) try: image = pygame.image.load(fullname) except pygame.error, message: print 'Cannot load image:', fullname raise SystemExit, message image = image.convert() if colorkey is not None: if colorkey is -1: colorkey = image.get_at((0,0)) image.set_colorkey(colorkey, RLEACCEL) return image, image.get_rect() class Button(pygame.sprite.Sprite): """Class used to create a button, use setCords to set position of topleft corner. Method pressed() returns a boolean and should be called inside the input loop.""" def __init__(self): pygame.sprite.Sprite.__init__(self) self.image, self.rect = load_image('button.png', -1) def setCords(self,x,y): self.rect.topleft = x,y def pressed(self,mouse): if mouse[0] > self.rect.topleft[0]: if mouse[1] > self.rect.topleft[1]: if mouse[0] < self.rect.bottomright[0]: if mouse[1] < self.rect.bottomright[1]: return True else: return False else: return False else: return False else: return False def main(): button = Button() #Button class is created button.setCords(200,200) #Button is displayed at 200,200 while 1: for event in pygame.event.get(): if event.type == MOUSEBUTTONDOWN: mouse = pygame.mouse.get_pos() if button.pressed(mouse): #Button's pressed method is called print ('button hit') if __name__ == '__main__': main() 

Gracias a cualquiera que pueda ayudarme.

No tengo un ejemplo de código para ti, pero cómo lo haría es:

  1. Haga una clase de botón, con el texto para ir al botón como un argumento de constructor
    1. Crea una superficie de PyGame, ya sea de una imagen o de un Rect relleno.
    2. Renderice el texto en él con las cosas de Font.Render en Pygame
  2. Blit a la pantalla del juego, guarde ese rect.
  3. Compruebe, al hacer clic con el mouse, para ver el mouse.get_pos () coincide con una coordenada en la dirección correcta que regresó con la mancha del botón a la superficie principal.

Eso es similar a lo que está haciendo su ejemplo, aunque aún diferente.

El ‘código’ que has encontrado en línea no es tan bueno. Todo lo que necesitas para hacer un botón es esto. Ponga esto cerca del comienzo de su código:

 def Buttonify(Picture, coords, surface): image = pygame.image.load(Picture) imagerect = image.get_rect() imagerect.topright = coords surface.blit(image,imagerect) return (image,imagerect) 

Pon lo siguiente en tu bucle de juego. También en algún lugar de tu bucle de juego:

 Image = Buttonify('YOUR_PICTURE.png',THE_COORDS_OF_THE_BUTTON'S_TOP_RIGHT_CORNER, THE_NAME_OF_THE_SURFACE) 

También ponga esto en su bucle de juego donde lo haya hecho for event in pygame.event.get

 if event.type == MOUSEBUTTONDOWN and event.button == 1: mouse = pygame.mouse.getpos if Image[1].collidrect(mouse): #code if button is pressed goes here 

Así, buttonify carga la imagen que estará en el botón. Esta imagen debe ser un archivo .jpg o cualquier otro archivo de IMAGEN en el mismo directorio que el código. La imagen es su nombre. El nombre debe tener .jpg o cualquier otra cosa después de él y el nombre debe estar entre comillas. El parámetro de coords en Buttonify es la coordenada superior derecha en su pantalla o ventana que se abre desde pygame. La superficie es esta cosa:

 blahblahblah = pygame.surface.set_mode((WindowSize)) /|\ | Surface's Name 

Por lo tanto, la función crea algo llamado ‘imagen’, que es una superficie de pygame, coloca un rectángulo alrededor de él llamado ‘imagerect’ (para establecerlo en una ubicación y para el segundo parámetro cuando se ejecuta el proceso), y luego establece su ubicación y Blits en la segunda hasta la última línea.

El siguiente bit de código hace que ‘Image’ sea una tupla de ‘image’ e ‘imagerect’.

El último código tiene if event.type == MOUSEBUTTONDOWN and event.button == 1: que básicamente significa que si se presiona el botón izquierdo del mouse. Este código DEBE estar en el for event in pygame.event.get . La siguiente línea hace del mouse una tupla de la posición de los ratones. La última línea verifica si el mouse chocó con la Imagen [1] que, como sabemos, es ‘imagerect’. El código sigue eso.

Dime si necesito explicarte más.

Así que tienes que hacer una función llamada botón que recibe 8 parámetros. 1) Mensaje del botón 2) Posición X de la esquina superior izquierda del botón 3) Posición Y de la esquina superior izquierda del botón 4) Ancho del botón 5) Altura del botón 6) Color inactivo (color de fondo) 7) Color activo (color cuando se desplaza) 8) Nombre de la acción que desea realizar

 def button (msg, x, y, w, h, ic, ac, action=None ): mouse = pygame.mouse.get_pos() click = pygame.mouse.get_pressed() if (x+w > mouse[0] > x) and (y+h > mouse[1] > y): pygame.draw.rect(watercycle, CYAN, (x, y, w, h)) if (click[0] == 1 and action != None): if (action == "Start"): game_loop() elif (action == "Load"): ##Function that makes the loading of the saved file## elif (action == "Exit"): pygame.quit() else: pygame.draw.rect(watercycle, BLUE, (x, y, w, h)) smallText = pygame.font.Font("freesansbold.ttf", 20) textSurf, textRect = text_objects(msg, smallText) textRect.center = ( (x+(w/2)), (y+(h/2)) ) watercycle.blit(textSurf, textRect) 

Así que cuando creas tu bucle de juego y llamas a la función de botón:

botón (“Inicio”, 600, 120, 120, 25, AZUL, CYAN, “Inicio”)

Aquí hay una clase para un botón que hice hace años: https://www.dropbox.com/s/iq5djllnz0tncc1/button.py?dl=0 El botón es de estilo windows 7 hasta donde puedo recordar, y no he estado capaz de probarlo recientemente porque no tengo pygame en la computadora que estoy usando. ¡Espero que esto ayude!