2012-06-12 24 views
11

Me preguntaba cómo escribir código que detectaría el mouse al hacer clic en un sprite. Por ejemplo:Detección de clic de mouse de Pygame

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

Respuesta

6

The pygame documentation for mouse events is here. Puede utilizar el método pygame.mouse.get_pressed en colaboración con pygame.mouse.get_pos (si es necesario). Pero utilice el evento de clic del mouse a través de un bucle de evento principal. La razón por la cual el ciclo de eventos es mejor se debe a "clics cortos". Es posible que no se den cuenta de esto en las máquinas normales, pero las computadoras que usan clics de tecla en los "trackpads" tienen periodos de clics excesivamente pequeños. Usar los eventos del mouse evitará esto.

EDIT: Para realizar el píxel colisiones perfectas utilizan pygame.sprite.collide_rect() encontrado en their docs for sprites.

+0

¿Cómo se aplicaría lo que al hacer clic en un sprite sin embargo? –

+0

@EliasBenevedes Edité mi respuesta con colisiones perfectas de píxeles. – jakebird451

21

Supongo que su juego tiene un bucle principal, y todos sus sprites están en una lista llamada sprites.

En su bucle principal, obtenga todos los eventos y verifique el evento MOUSEBUTTONDOWN o MOUSEBUTTONUP.

while ... # your main loop 
    # get all events 
    ev = pygame.event.get() 

    # proceed events 
    for event in ev: 

    # handle MOUSEBUTTONUP 
    if event.type == pygame.MOUSEBUTTONUP: 
     pos = pygame.mouse.get_pos() 

     # get a list of all sprites that are under the mouse cursor 
     clicked_sprites = [s for s in sprites if s.rect.collidepoint(pos)] 
     # do something with the clicked sprites... 

Así que, básicamente, debe hacer clic en un sprite cada iteración de la vuelta principal. Deseará usar mouse.get_pos() y rect.collidepoint().

Pygame no ofrece programación basada en eventos, como p. cocos2d hace.

Otra forma sería verificar la posición del cursor del mouse y el estado de los botones, pero este enfoque tiene algunos problemas.

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

Vas a tener que introducir algún tipo de indicador si se maneja este caso, ya que de lo contrario el código imprimirá "Tiene que haber abierto un cofre!" cada iteración del ciclo principal.

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] 

Por supuesto que puede subclase Sprite y añadir un método llamado is_clicked así:

class MySprite(Sprite): 
    ... 

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

lo tanto, es mejor utilizar el primer enfoque en mi humilde opinión.

+3

También tenga en cuenta que la posición del mouse también está disponible en el evento en 'event.pos' –

3

que estaba buscando la misma respuesta a esta pregunta y después de mucho rascarse la cabeza esta es la respuesta que se me ocurrió:

#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 
Cuestiones relacionadas