Partage
  • Partager sur Facebook
  • Partager sur Twitter

Evenement à la souris

Sujet résolu
    12 septembre 2017 à 9:03:34

    Bonjour, je suis en train de coder un mini-jeu, j'ai fais l'écran titre et y est insérer des bouton (jouer et quitter). Cependant quand je clic sur le bouton rien ne se passe (j'ai bien su gérer le fait que la souris rentre dans la zone "bouton" mais le clique ne fonctionne pas). Si une âme charitable saurais m'aider :)

    import pygame
    from pygame.locals import *
    
    from constants import *
    
    """Classe permettant de charger une map ou un ecran quelconque"""
    
    class Load():
        def __init__(self, window):
            """Initialisation"""
            self.window = window # On récupère le contenu de window dans la classe pour pouvoir l'utiliser ici.
            self.in_button = in_button
        
        def load(self, screen):
            """On affiche en fonction de la demande"""
    
            if screen == "title":
                #Si on cherche à afficher l'écran titre
                screen = pygame.image.load('ressources/screen_title.bmp').convert()
    
                #On affiche deux boutons (jouer et quitter)
                btn_play = pygame.image.load('ressources/btn.bmp').convert()
    
                # On affiche ensuite le texte sur le bouton
                font = pygame.font.Font('font_title.ttf', 36)
                text_play = font.render('Jouer', True, (255,255,255))
                text_playpos = text_play.get_rect()
                text_playpos.x = WINDOW_W/2 - 100 #On le position sur le meme axe x que le bouton mais on divise pas 2 et on enleve 100 de nouveau fois pour etre bien dedans
                text_playpos.y = WINDOW_H/2 + 5 #On ajoute 5 px pour etre bien centrer dans le bouton
                            
                btn_quit = pygame.image.load('ressources/btn.bmp').convert()
    
                # Pareil que au dessus, on affiche le texte du bouton
                text_quit = font.render('Quitter', True, (255,100,100))
                text_quitpos = text_quit.get_rect()
                text_quitpos.x = WINDOW_W/2 - 100
                text_quitpos.y = WINDOW_H/2 + 65 # On ajoute 60 pour ne pas etre a cheval sur l'autre texte
    
                # On blit le tout
                self.window.blit(screen, (0,0))
                
                self.window.blit(btn_play, (WINDOW_W/2/2, WINDOW_H/2)) # On divise par deux la largeur de la fenetre et on redivise par deux pour ne pas etre trop au milieu
                self.window.blit(btn_quit, (WINDOW_W/2/2, WINDOW_H/2 + 60)) #On ajoute qui correspond à la taille d'un bouton + 10px
                
                self.window.blit(text_play, text_playpos)
                self.window.blit(text_quit, text_quitpos)
                
                # Maintenant qu'on l'écran titre est afficher, on va permettre que l'utilisateur puissent intergire avec
                for event in pygame.event.get():
                    if event.type == QUIT:
                        pygame.quit()
                        quit()
    
                    if event.type == MOUSEMOTION:
                        # On commence par le bouton jouer
                        if event.pos[0] > WINDOW_W/2/2 and event.pos[0] < WINDOW_W/2/2 + 500:
                            if event.pos[1] > WINDOW_H/2 and event.pos[1] < WINDOW_H/2+50:
                                self.in_button = True
                                print('dans le boutton')
    
                    # Nous permet de savoir si on se trouve dans le bouton ou pas
                    if self.in_button == True and event.type == MOUSEBUTTONUP and event.button == 1:
                        print('Jouer')
    
                    #print(event.button)
                print(self.in_button)
    



    • Partager sur Facebook
    • Partager sur Twitter
    Nooooooooooooooooooooooooooooooooooooooooon !!
      13 septembre 2017 à 5:05:00

      Salut,

      En fait, le plus facile serait de prendre les méthodes déjà inclus par pygame.

      Avec le rectangle (de la surface), vous pouvez détecter, tout ce qui touche ce rectangle.

      Grâce à:

      ## Charge l'image
      image = pygame.image.load('my_img.jpg')
      
      ## Trouve son rectangle
      son_rectangle = image.get_rect()
      
      ## Détecte axes du curseur.
      x, y = pygame.mouse.get_pos()
      
      ## Détecte collision entre un rectangle et le curseur
      collide = son_rectangle.collidepoint(x, y) 
      if collide:
          ...
      
      ## Détecte les cliques de souris.
      pressed = pygame.mouse.get_pressed()

      Exemple:

      import pygame
      
      pygame.init()
      
      ## A MODIFIER..
      fenetre = pygame.display.set_mode((300,300))
      
      ## Bouton (la surface)
      image_bouton = pygame.image.load('ressources/btn.bmp').convert()
      
      ## Son rectangle
      image_bouton_rect = image_bouton.get_rect()
      
      RUNNING = True
      
      while RUNNING:
      ## BLIT/FILL
          fenetre.fill( (255,255,255) )
          fenetre.blit(image_bouton, (50, 50))
      
      ## EVENTS
          for event in pygame.event.get():
              if event.type == pygame.QUIT:
                  RUNNING = False
      
          ## Si le curseur de la souris est dans la fenêtre, (si curseur sort de la fenêtre = False)
          if pygame.mouse.get_focused(): 
              ## Trouve sa position:
              x, y = pygame.mouse.get_pos()
      
              ## Detecte si l'axe X et Y de la souris, touche le rectangle de l'image
              collide = image_bouton_rect.collidepoint(x, y)
      
              if collide:
                  print('Oui, curseur sur le bouton..')
      
              ## Detecte, les cliques de souris.
              pressed = pygame.mouse.get_pressed()
      
              ## Si clique de GAUCHE.
              if pressed[0]: ## 0 = Gauche, 1 = Milieu, 2 = Droite
                  RUNNING = False
      
      ##         
          pygame.display.flip()
      
      pygame.quit()

      Vous remarquerez, que dans l'Exemple, l'image est chargé avant la boucle WHILE. Tandis que vous, vous chargez votre image à chaque itération de la boucle. De plus, vous charger deux fois la même image..

      Vous pouvez très bien faire ceci (Chargez l'image au début, ensuite, vous blit à 4 endroits.):

      image_bouton = pygame.image.load('ressources/btn.bmp').convert()
      image_bouton_rect = image_bouton.get_rect()
      
      ## Placer la même image, à 4 places différentes.
      while True:
          fenetre.blit(image_bouton, (30, 30))
          fenetre.blit(image_bouton, (130, 130))
          fenetre.blit(image_bouton, (230, 230))
          fenetre.blit(image_bouton, (330, 330))

      Pour finir, le clavier et la souris ont sensiblement les mêmes méthodes.

      import pygame
      
      ## Détecte les touches de clavier
      pressed = pygame.key.get_pressed()
      
      if pressed[pygame.K_UP]: ## Haut..
          ...
      if pressed[pygame.K_DOWN]: ## Bas..
          ...

      J'espère que cela vous aideras.

      Voilà, bonne chance.

      A+

      -
      Edité par nolimitech 13 septembre 2017 à 5:13:09

      • Partager sur Facebook
      • Partager sur Twitter
        14 septembre 2017 à 11:15:48

        Merci pour cette réponse très détailler et hautement interessente. C'est une grande aide :)
        • Partager sur Facebook
        • Partager sur Twitter
        Nooooooooooooooooooooooooooooooooooooooooon !!

        Evenement à la 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