2012-06-12 23 views
11

Mi chiedevo come scrivere codice che rilevi il clic del mouse su uno sprite. Ad esempio:Rilevazione clic del mouse Pygame

if #Function that checks for mouse clicked on Sprite: 
    print ("You have opened a chest!") 

risposta

6

The pygame documentation for mouse events is here. È possibile utilizzare il metodo pygame.mouse.get_pressed in collaborazione con lo pygame.mouse.get_pos (se necessario). Ma si prega di utilizzare l'evento clic del mouse tramite un ciclo di eventi principale. Il motivo per cui il ciclo degli eventi è migliore è dovuto ai "clic brevi". Potresti non accorgertene su macchine normali, ma i computer che utilizzano tap-click su trackpad hanno periodi di clic eccessivamente piccoli. L'uso degli eventi del mouse impedirà questo.

EDIT: Per eseguire pixel collisioni perfetti utilizzano pygame.sprite.collide_rect() trovato su their docs for sprites.

+0

Come potrei applicare tale a fare clic su uno sprite però? –

+0

@EliasBenevedes Ho modificato la mia risposta con collisioni perfette di pixel. – jakebird451

21

Presumo che il gioco abbia un ciclo principale e tutti gli sprite si trovino in un elenco chiamato sprites.

Nel tuo ciclo principale, ottieni tutti gli eventi e verifica l'evento MOUSEBUTTONDOWN o MOUSEBUTTONUP.

Quindi, in pratica, è necessario verificare un clic su uno sprite da soli ogni iterazione del mainloop. Ti consigliamo di utilizzare mouse.get_pos() e rect.collidepoint().

Pygame non offre programmazione guidata da eventi, come ad es. cocos2d fa.

Un altro modo sarebbe controllare la posizione del cursore del mouse e lo stato dei pulsanti premuti, ma questo approccio presenta alcuni problemi.

if pygame.mouse.get_pressed()[0] and mysprite.rect.collidepoint(pygame.mouse.get_pos()): 
    print ("You have opened a chest!") 

Dovrete introdurre una sorta di bandiera, se si ha gestito questo caso, dal momento che altrimenti questo codice stamperà "è stato aperto un petto!" ogni iterazione del ciclo principale.

handled = False 

while ... // your loop 

    if pygame.mouse.get_pressed()[0] and mysprite.rect.collidepoint(pygame.mouse.get_pos()) and not handled: 
    print ("You have opened a chest!") 
    handled = pygame.mouse.get_pressed()[0] 

Naturalmente è possibile creare una sottoclasse Sprite e aggiungere un metodo chiamato is_clicked come questo:

class MySprite(Sprite): 
    ... 

    def is_clicked(self): 
    return pygame.mouse.get_pressed()[0] and self.rect.collidepoint(pygame.mouse.get_pos()) 

Quindi, è meglio utilizzare il primo approccio IMHO.

+3

Si noti inoltre che la posizione del mouse è disponibile anche nell'evento stesso sotto 'event.pos' –

3

che stavo cercando la stessa risposta a questa domanda e dopo molte grattarsi la testa questa è la risposta mi è venuta:

#Python 3.4.3 with Pygame 
import pygame 

pygame.init() 
pygame.display.set_caption('Crash!') 
window = pygame.display.set_mode((300, 300)) 
running = True 

# Draw Once 
Rectplace = pygame.draw.rect(window, (255, 0, 0),(100, 100, 100, 100)) 
pygame.display.update() 
# Main Loop 
while running: 
    # Mouse position and button clicking. 
    pos = pygame.mouse.get_pos() 
    pressed1, pressed2, pressed3 = pygame.mouse.get_pressed() 
    # Check if the rect collided with the mouse pos 
    # and if the left mouse button was pressed. 
    if Rectplace.collidepoint(pos) and pressed1: 
     print("You have opened a chest!") 
    # Quit pygame. 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
Problemi correlati