2008-12-19 18 views
5

¿Cuál es la forma canónica de hacer que tus sprites respondan a los clics del mouse en PyGame?¿Cómo respondo a los clics del mouse en sprites en PyGame?

Esto es algo simple, en mi bucle de eventos:

for event in pygame.event.get(): 
    if event.type == pygame.QUIT: 
     exit_game() 
    [...] 
    elif ( event.type == pygame.MOUSEBUTTONDOWN and 
      pygame.mouse.get_pressed()[0]): 
     for sprite in sprites: 
      sprite.mouse_click(pygame.mouse.get_pos()) 

Algunas preguntas al respecto:

  1. Es ésta la mejor manera de responder a los clics del ratón?
  2. ¿Qué sucede si el mouse permanece presionado en el sprite durante algún tiempo? ¿Cómo hago un único evento?
  3. ¿Es esta una forma razonable de notificar a todos mis sprites del clic?

Gracias de antemano

Respuesta

10

que suelo dar mi hacer clic en los objetos en función clic, al igual que en su ejemplo. Puse todos esos objetos en una lista, para facilitar la iteración cuando se van a llamar las funciones de clic.

al comprobar para qué botón del mouse presionas, utiliza el botón propiedad del evento.

import pygame 
from pygame.locals import * #This lets you use pygame's constants directly. 

for event in pygame.event.get(): 
    if event.type == MOUSEBUTTONDOWN: #Better to seperate to a new if statement aswell, since there's more buttons that can be clicked and makes for cleaner code. 
     if event.button == 1: 
      for object in clickableObjectsList: 
       object.clickCheck(event.pos) 

Yo diría que esta es la forma recomendada de hacerlo. El clic solo se registra una vez, por lo que no le dirá a tu sprite si el usuario está "arrastrando" con un botón. Esto se puede hacer fácilmente con un booleano que se establece en verdadero con el evento MOUSEBUTTONDOWN y falso con el MOUSEBUTTONUP. Tienen objetos "arrastrables" iterados para activar sus funciones ... y así sucesivamente.

Sin embargo, si usted no desea utilizar un controlador de eventos, puede dejar un cheque función de actualización para la entrada con:

pygame.mouse.get_pos() 
pygame.mouse.get_pressed(). 

Ésta es una mala idea para proyectos más grandes, ya que puede crear dura para encontrar errores. Mejor simplemente mantener los eventos en un solo lugar. Sin embargo, los juegos más pequeños, como los simples juegos de arcade, pueden tener más sentido usando el estilo de sondeo.

+0

Gracias. Acerca de la parte 'event.button == 1', ¿no hay constante en lugar de esa explícita 1 en PyGame? –

+0

No creo que sea necesario. 1 es siempre el botón izquierdo, 2 el medio y 3 es el derecho. 3 es el derecho incluso en los ratones con solo dos botones. – Zoomulator

Cuestiones relacionadas