2008-12-19 7 views
5

Quelle est la méthode canonique pour que vos sprites réagissent aux clics de souris dans PyGame?Comment répondre aux clics de la souris sur les sprites dans PyGame?

Voici quelque chose de simple, dans ma boucle d'événement:

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

Quelques questions à son sujet:

  1. Est-ce la meilleure façon de répondre aux clics de souris?
  2. Que faire si la souris reste enfoncée sur l'image-objet pendant un certain temps? Comment puis-je en faire un seul événement?
  3. Est-ce un moyen raisonnable de notifier tous mes sprites du clic?

Merci à l'avance

Répondre

10

je donne généralement mon cliquable objets fonction de clic, comme dans votre exemple. Je mets tous ces objets dans une liste, pour une itération facile lorsque les fonctions de clic doivent être appelées. Lorsque vous vérifiez pour quel bouton de la souris vous appuyez sur, utilisez la propriété de bouton de l'événement

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) 

Je dirais que c'est la manière recommandée de le faire. Le clic seulement s'enregistre une fois, donc il ne dira pas à votre sprite si l'utilisateur est en train de "glisser" avec un bouton. Cela peut facilement être fait avec un booléen qui a la valeur true avec l'événement MOUSEBUTTONDOWN et false avec le MOUSEBUTTONUP. Les objets "draggable" sont itérés pour activer leurs fonctions ... et ainsi de suite.

Cependant, si vous ne voulez pas utiliser un gestionnaire d'événements, vous pouvez laisser un contrôle de la fonction de mise à jour pour l'entrée avec:

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

Ceci est une mauvaise idée pour les grands projets, car il peut créer dur pour trouver des bugs. Mieux vaut simplement garder les événements au même endroit. Des jeux plus petits, comme de simples jeux d'arcade, pourraient avoir plus de sens en utilisant le style de sondage.

+0

Merci. A propos de la partie 'event.button == 1', n'y a-t-il pas de constante au lieu de cette 1 explicite dans PyGame? –

+0

Je ne pense pas que ce soit nécessaire. 1 est toujours le bouton gauche, 2 le milieu, et 3 est le droit. 3 est le droit même sur les souris avec seulement deux boutons. – Zoomulator

Questions connexes