tutorial juegos hechos games documentacion python pygame

python - juegos - pygame tutorial



¿Cómo respondo a los clics del mouse en sprites en PyGame? (1)

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

Aquí hay algo simple, en mi ciclo 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 esta la mejor forma de responder a los clics del mouse?
  2. ¿Qué pasa si el mouse permanece presionado en el sprite por algún tiempo? ¿Cómo hago un único evento?
  3. ¿Es esta una forma razonable de notificar a todos mis sprites del clic?

Gracias por adelantado


Normalmente doy a mis objetos clicables una función de clic, como en tu ejemplo. Puse todos esos objetos en una lista, para facilitar la iteración cuando se van a llamar las funciones de clic.

cuando compruebe para qué botón del mouse presiona, use 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. Eso 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 no desea utilizar un controlador de eventos, puede dejar que una función de actualización compruebe la entrada con:

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

Esta es una mala idea para proyectos más grandes, ya que puede crear errores difíciles de encontrar. 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.