Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pygame gestion évènement souris

Sujet résolu
    25 janvier 2011 à 21:43:15

    Bonsoir ! Je suis actuellement en train de coder un petit casse-tête (Python/pygame).

    Voici mon problème :
    J'ai créé une grille(composée de "rects")... Je souhaiterais que lorsque le joueur clique dans une case, une valeur soit enregistrée et qu' elle soit attribuée à la "cible" au clique suivant.

    Merci pour votre aide... ;)
    • Partager sur Facebook
    • Partager sur Twitter
      25 janvier 2011 à 23:06:55

      en clair ?
      c'est quoi la valeur? c'est quoi la cible ?
      • Partager sur Facebook
      • Partager sur Twitter

      Python c'est bon, mangez-en. 

        25 janvier 2011 à 23:07:28

        Salut !

        Je ferais quelque chose dans ce goût là moi.

        D'abord initialiser une variable "verrou" à False. Cette variable va permettre de savoir si l'utilisateur clique sur la case de départ ou s'il est en train de cliquer sur la seconde (l'arrivée).

        Ensuite, facile. Lorsqu'on clique sur une case, si verrou est faux, on lui attribue True et on stocke quelque part la position de la case (ou sa référence s'il s'agit d'un objet).
        Dans le cas où verrou est vrai, on la réinitialise à False. Puisque verrou était vrai, l'utilisateur a cliqué sur la case d'arrivée. Il suffit de récupérer la valeur de la case de départ mémorisée et tu as toutes les informations que tu souhaites. :)

        Voilà pour le système de sélection d'une case départ et une autre d'arrivée.

        Pour savoir sur quelle case on clique je vois grosso modo deux méthodes. Soit tu relèves la position de la souris et tu divises par la dimension d'une case pour obtenir les coordonnées de la case.
        Soit tu crées un objet "Case" qui se charge de détecter si on clique dessus et qui renvois une référence vers lui-même ou sa position dans la grille.

        En espérant être assez clair... ^^
        • Partager sur Facebook
        • Partager sur Twitter
          25 janvier 2011 à 23:16:29

          ha oké, ben la réponse est dans la question ...
          suffit d'init une variable à une valeur non valide.
          genre:
          valeur tampon= None
          si clic:
              si valeur == None: valeur = valeur case
              sinon:
                  valeur case = valeur tampon
                  valeur tampon = None
          
          • Partager sur Facebook
          • Partager sur Twitter

          Python c'est bon, mangez-en. 

            25 janvier 2011 à 23:27:46


            A clic4
            "Pour savoir sur quelle case on clique je vois grosso modo deux méthodes. Soit tu relèves la position de la souris et tu divises par la dimension d'une case pour obtenir les coordonnées de la case."
            Je ne comprends pas ! :(

            • Partager sur Facebook
            • Partager sur Twitter
              26 janvier 2011 à 1:05:49

              J'ai expliqué un peu rapidement c'est sûr ^^ Je ne pensais pas que c'était un soucis, désolé. Ci-dessous un exemple de code pour détailler.

              En divisant la position de la souris par la dimension d'une case tu obtiens directement la coordonnée de la case. Pour une case de 20x20 pixels, si la souris se trouve sur la première case, ses coordonnées x et y sont entre 0 et 20.
              En divisant par la taille de la case, 20, on obtient un résultat allant de 0 à 1. En arrondissant à l'entier inférieur, on obtient 0 : c'est la position de la case. Le raisonnement est identique en x et en y.

              Admettons qu'on soit sur la seconde case horizontalement, cette fois-ci la coordonnée x sera nécessairement entre 20 et 40, donc le résultat de la division (par ex. 26/20=1.3) sera compris entre 1 et 2... et ainsi de suite.
              Dans le code que je te donne en exemple, l'arrondis est effectuée par l'opérateur de division (/). Si tes positions sont des float il faudra utiliser math.floor.


              # -*- coding: utf-8 -*-
              import pygame, time
              
              dimEcranX, dimEcranY = 400.0, 400.0     # Dimension de la grille
              ecran = pygame.display.set_mode((dimEcranX, dimEcranY))
              
              dimX, dimY = 40, 40     # Case de 40x40
              
              while True:
                  ev = pygame.event.poll()
                  if ev.type == pygame.KEYDOWN and ev.key == pygame.K_ESCAPE: break
                  if ev.type == pygame.QUIT: break
              
                  posSouris = pygame.mouse.get_pos()  # Récupérer la position du pointeur
              
                  posCaseX = (posSouris[0]) / dimX    # On divise la position de la souris par la dimension de la case
                  posCaseY = (posSouris[1]) / dimY
              
                  print "Position - x: " + str(posCaseX) + ", y: " + str(posCaseY)
              
                  # Dessiner la grille
                  for y in range(0, 400, dimY):
                      pygame.draw.line(ecran, 0xee0000, (0, y), (dimEcranX, y) )
              
                  for x in range(0, 400, dimX):
                      pygame.draw.line(ecran, 0xee0000, (x, 0), (x, dimEcranY) )
              
              
                  pygame.display.flip()
                  time.sleep(0.1)
              
              • Partager sur Facebook
              • Partager sur Twitter
                26 janvier 2011 à 7:32:40

                Citation : clic4


                Pour savoir sur quelle case on clique je vois grosso modo deux méthodes. Soit tu relèves la position de la souris et tu divises par la dimension d'une case pour obtenir les coordonnées de la case.
                Soit tu crées un objet "Case" qui se charge de détecter si on clique dessus et qui renvois une référence vers lui-même ou sa position dans la grille.



                ça dépend quand même de la structure de la grille; à savoir si c'est une matrice ou une simple liste. ça peut être intéressant d'utiliser Rect.collidelist(Rects).

                ex:
                from pygame import *
                screen = display.set_mode((400,400)).fill
                # creation de la liste de rects
                grid = [screen(0xffffff,(x*40+5,y*40+5,30,30)) for x in range(10) for y in range(10)]
                display.flip()
                while True:
                    ev = event.wait()
                    if ev.type == QUIT: break
                    # si clic ...
                    elif ev.type == MOUSEBUTTONDOWN:
                        # recuperation de l'index du rect en collision avec la souris
                        index = Rect(mouse.get_pos(),(0,0)).collidelist(grid)
                        if index + 1: print 'CASE: ',index
                        else:print 'OUT'
                


                Cependant, collidelist() n'est valable que pour des listes de petite taille.
                Pour des systemes de rects ordonnés genre matrices, la meilleure méhode reste à mon avis, comme l'a dit clic4, de calculer en fonction de la position du pointeur de souris.
                • Partager sur Facebook
                • Partager sur Twitter

                Python c'est bon, mangez-en. 

                  26 janvier 2011 à 20:29:38

                  Merci à vous deux, "clic4" et "josmiley" !!! Je vais enfin pouvoir continuer !
                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 janvier 2011 à 11:09:42

                    on espère bien voir le produit final ...
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Python c'est bon, mangez-en. 

                    Pygame gestion évènement souris

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown