2012-04-16 6 views
6

Sto facendo un gioco in pygame e sul primo schermo voglio che ci siano dei pulsanti che puoi premere per (i) avviare il gioco, (ii) caricare una nuova schermata con le istruzioni e (iii) uscire dal programma .Come creare pulsanti in python/pygame?

Ho trovato questo codice online per la creazione di pulsanti, ma non lo capisco davvero (non sono così bravo nella programmazione orientata agli oggetti). Se potessi avere qualche spiegazione su quello che sta facendo sarebbe grandioso. Inoltre, quando lo uso e provo ad aprire un file sul mio computer usando il percorso del file, ottengo l'errore sh: filepath: Autorizzazione negata, che non so come risolvere.

#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() 

Grazie a tutti coloro che possono aiutarmi.

risposta

12

Non ho un esempio di codice per voi, ma come lo farei è quello di:

  1. fare una classe Button, con il testo di andare sul pulsante come argomento del costruttore
    1. Creare una superficie di PyGame, o di un'immagine o riempito Rect
    2. Render testo su di esso con la roba Font.Render in Pygame
  2. Blit a tutto schermo giochi, salvo che rett.
  3. Controllare, al clic del mouse, per vedere il mouse.get_pos() corrisponde a un coord nella riga che ha restituito dal blit del pulsante alla superficie principale.

Questo è simile a ciò che l'esempio sta facendo, anche se diverso ancora.

+0

OK, ci provo, grazie per l'aiuto. – user1334014

0

Il "codice" che hai trovato online non è buono. Tutto ciò che serve per creare un pulsante è questo. Metti questo vicino all'inizio del tuo codice:

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

Metti il ​​seguente nel tuo ciclo di gioco. Inoltre da qualche parte nel vostro gioco ciclo:

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

messo anche questo nel vostro ciclo di gioco ovunque voi avete fatto 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 

Quindi, buttonify carica l'immagine che sarà sul pulsante. Questa immagine deve essere un file .jpg o qualsiasi altro file PICTURE nella stessa directory del codice. L'immagine è il suo nome. Il nome deve avere .jpg o qualsiasi altra cosa dopo di esso e il nome deve essere tra virgolette. Il parametro coords in Buttonify è la coordinata in alto a destra sullo schermo o sulla finestra che si apre da pygame. La superficie è questa cosa:

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

Quindi la funzione fa qualcosa chiamato 'immagine', che è una superficie pygame, si mette un rettangolo intorno ad esso chiama 'imagerect' (per impostare la macchina alla posizione e per la seconda parametro quando si blitter,) e quindi imposta la sua posizione, e la blits sulla penultima riga.

Il prossimo bit di codice rende 'Immagine' una tupla sia di 'immagine' che di 'imagerect'.

L'ultimo codice ha if event.type == MOUSEBUTTONDOWN and event.button == 1: che significa in sostanza se si preme il pulsante sinistro del mouse. Questo codice DEVE essere in for event in pygame.event.get. La riga successiva rende mouse una tupla della posizione dei mouse.L'ultima riga controlla se il mouse è entrato in collisione con Immagine [1] che, come sappiamo, è "imagerect". Il codice lo segue.

Dimmi se ho bisogno di spiegare ulteriormente.

0

Quindi è necessario eseguire una funzione denominata pulsante che riceve 8 parametri. 1) Messaggio del pulsante 2) Posizione X dell'angolo superiore sinistro del pulsante 3) Posizione Y dell'angolo superiore sinistro del pulsante 4) Larghezza del pulsante 5) Altezza del pulsante 6) Colore inattivo (colore di sfondo) 7) di colore attivo (colore quando si passa) 8) nome dell'azione che si desidera perfom

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) 

Quindi, quando si crea il ciclo di gioco e si chiama la funzione del pulsante:

tasto ("Inizio", 600, 120, 120, 25, BLU, CIANO, "Inizio")