Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pygame, attendre qu'un événement se produise

    23 juillet 2021 à 1:56:25

    Bonjour, je suis en train de coder un jeu, le but est assez simple, taper sur une bulle quand celle-ci apparait puis quand cette bulle est tapée une autre apparait et on doit taper sur celle ci et ainsi de suite, je rencontre un problème, voici mon code entier : 
    import pygame
    import random, time, os
    from pygame.locals import *
    
    
    
    #éléments importés
    logo = pygame.image.load("assets/logo1.1.png")
    bg = pygame.image.load("assets/galaxie-30067.jpg")
    a1 = pygame.image.load("assets/accueil1_1.png")
    bulle = pygame.image.load("assets/bulle.png")
    bulle_rect = bulle.get_rect()
    
    
    pygame.init()
    
    clock = pygame.time.Clock()
    font = pygame.font.Font(None , 64)
    blue = pygame.Color("white")
    orig_surf = font.render('Appuyez sur espace pour jouer', True, blue)
    txt_surf = orig_surf.copy()
    alpha_surf = pygame.Surface(txt_surf.get_size(), pygame.SRCALPHA)
    alpha = 0
    fade_in = True
    
    
    
    #générer la fenêtre
    pygame.display.set_caption("Pygo")
    screen = pygame.display.set_mode((1200,800), RESIZABLE)
    
    
    running = True
    
    while running:
    
    
    
        for event in pygame.event.get():
    
            # evenement est fermeture de fenêtre
            if event.type == pygame.QUIT:
                running = False
                pygame.quit()
    
            # début du jeu
            elif event.type == KEYDOWN:
                if event.key == pygame.K_SPACE:
                    print("space")
                    while 1 < 2:
                        screen.blit(bg, (0, 0))
                        pygame.display.flip()
                        #position du x
                        xbulle = random.randint(1, 1100)
                        print(xbulle)
                        #position du y
                        ybulle = random.randint(1, 700)
                        print(ybulle)
                        #apparition de la bulle
                        bulle_rect.x = xbulle
                        bulle_rect.y = ybulle
                        screen.blit(bulle, bulle_rect)
                        pygame.display.flip()
                        for event in pygame.event.get():
                            if event.type == MOUSEBUTTONDOWN:
                                if event.button == 1:
                                    if bulle_rect.collidepoint(event.pos):
                                        print("touché")
                                    else:
                                        print("raté")
                                else:
                                    print("raté")
                            # evenement est fermeture de fenêtre
                            if event.type == pygame.QUIT:
                                running = False
                                pygame.quit()
    
        #opacité
        if alpha >= 0 and fade_in is True:
            alpha += 5
            if alpha >= 255:
                alpha = 255
                fade_in = False
    
        #opacité
        if alpha <= 255 and fade_in is False:
            alpha -= 5
            if alpha <= 0:
                alpha = 0
                fade_in = True
        #affichage du texte + du fond d'écran d'accueil
        txt_surf = orig_surf.copy()
        alpha_surf.fill((255, 255, 255, alpha))
        txt_surf.blit(alpha_surf, (0, 0), special_flags=pygame.BLEND_RGBA_MULT)
        screen.blit(a1, (0, 0))
        screen.blit(txt_surf, (280, 725))
        pygame.display.flip()
    en fait a partir du "while 1 < 2" je ne contrôle plus mon programme, une bulle apparait puis disparait puis une autre apparait et ainsi de suite, tout ça a la suite, je voudrais savoir si il y a un moyen pour "mettre pause le programme" jusqu'a ce que je touche la bulle, je ne sais pas si je suis très clair, je l'espère, merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      23 juillet 2021 à 6:38:32

      Pourquoi ne pas simplement apprendre la programmation au sens large avant de te lancer dans un tel projet ?
      • Partager sur Facebook
      • Partager sur Twitter

      "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

        23 juillet 2021 à 12:44:00

        le programme fait ce que tu lui demandes: regarde ta boucle while 1<2, que fais-tu dedans ?
        • Partager sur Facebook
        • Partager sur Twitter
          23 juillet 2021 à 14:05:51

          Bah je pensais qu'en mettant mon while la ça allait redémarrer a la ligne 51 quand on a touché une bulle
          • Partager sur Facebook
          • Partager sur Twitter
            23 juillet 2021 à 15:09:13

            pour quelle raison ça pourrait être le cas ? ta boucle for event in pygame.event.get() ne va gérer des événements que si il y en a eu, si il n'y en a pas, on sort du for, et donc on poursuit le programme (ici on revient au début du while)

            Regarde le tuto de zestedesavoir dont je crois t'avoir déjà communiqué le lien (rien n'empêche, au contraire, de regarder les pages suivantes et précédentes du tutos ^^) https://zestedesavoir.com/tutoriels/846/pygame-pour-les-zesteurs/1381_a-la-decouverte-de-pygame/5508_la-gestion-des-evenements/#2-15431_comment-les-capturer )

            • Partager sur Facebook
            • Partager sur Twitter
              23 juillet 2021 à 15:34:42

              j'ai tout lu, la dernière fois aussi j'avais lu mais je ne devais pas être super concentré mais j'ai un problème voici mon code :
                              while a < b:
                                  screen.blit(bg, (0, 0))
                                  pygame.display.flip()
                                  #position du x
                                  xbulle = random.randint(1, 1100)
                                  print(xbulle)
                                  #position du y
                                  ybulle = random.randint(1, 700)
                                  print(ybulle)
                                  #apparition de la bulle
                                  bulle_rect.x = xbulle
                                  bulle_rect.y = ybulle
                                  screen.blit(bulle, bulle_rect)
                                  pygame.display.flip()
                                  event1 = pygame.event.wait()
                                  if event1.type == MOUSEBUTTONDOWN:
                                      if event.button == 1:
                                          if bulle_rect.collidepoint(event.pos):
                                              print("touché")
              
              
                                          else:
                                              print("raté")
                                      else:
                                          print("raté")
                                  else:
                                      print("raté")
              
              en fait rien qu'un mouvement de souris c'est compté comme "raté", hors pour toucher la petite bulle il faut déplacer sa souris, mais je ne comprends pas
              • Partager sur Facebook
              • Partager sur Twitter
                23 juillet 2021 à 15:42:03

                le déplacement de la souris c'est un événement aussi; le "raté ne devrait apparaitre que lors du clic et bulle non touchée, et pas dans les autres événements
                • Partager sur Facebook
                • Partager sur Twitter
                  23 juillet 2021 à 16:08:02

                  mais rien que lorsque je déplace la souris, ça redémarre la boucle et ça fait réapparaitre une nouvelle bulle etc...

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 juillet 2021 à 16:50:57

                    voir ton autre sujet, ici le event.wait() attend un événement; une fois traité, on va début de la boucle. peut-être revoir les bases (des boucles et des conditions en particulier) comme on te l'a suggéré plusieurs fois

                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 juillet 2021 à 17:05:26

                      c'est pas ça le problème mes bases je les connais et je sais ce que c'est une boucle et des conditions, et je sais que quand mon code est fini ça revient a mon while, mais le problème est que je ne comprends pas pourquoi ça revient au while alors que j'ai précisé (maintenant) que pour revenir au while il faut un clic gauche dans le cercle
                      import pygame
                      import random, time, os
                      from pygame.locals import *
                      
                      
                      
                      #éléments importés
                      logo = pygame.image.load("assets/logo1.1.png")
                      bg = pygame.image.load("assets/galaxie-30067.jpg")
                      a1 = pygame.image.load("assets/accueil1_1.png")
                      bulle = pygame.image.load("assets/bulle.png")
                      bulle_rect = bulle.get_rect()
                      
                      
                      pygame.init()
                      
                      clock = pygame.time.Clock()
                      font = pygame.font.Font(None , 64)
                      blue = pygame.Color("white")
                      orig_surf = font.render('Appuyez sur espace pour jouer', True, blue)
                      txt_surf = orig_surf.copy()
                      alpha_surf = pygame.Surface(txt_surf.get_size(), pygame.SRCALPHA)
                      alpha = 0
                      fade_in = True
                      
                      
                      
                      
                      #générer la fenêtre
                      pygame.display.set_caption("Pygo")
                      screen = pygame.display.set_mode((1200,800), RESIZABLE)
                      
                      
                      running = True
                      
                      while running:
                      
                      
                      
                          for event in pygame.event.get():
                      
                              # evenement est fermeture de fenêtre
                              if event.type == pygame.QUIT:
                                  running = False
                                  pygame.quit()
                      
                              # début du jeu
                              elif event.type == KEYDOWN:
                                  if event.key == pygame.K_SPACE:
                                      print("space")
                                      a = 1
                                      b = 3
                                      while a < b:
                                          screen.blit(bg, (0, 0))
                                          pygame.display.flip()
                                          #position du x
                                          xbulle = random.randint(1, 1100)
                                          print(xbulle)
                                          #position du y
                                          ybulle = random.randint(1, 700)
                                          print(ybulle)
                                          #apparition de la bulle
                                          bulle_rect.x = xbulle
                                          bulle_rect.y = ybulle
                                          screen.blit(bulle, bulle_rect)
                                          pygame.display.flip()
                                          event1 = pygame.event.wait()
                                          if event1.type == MOUSEBUTTONDOWN:
                                              if event.button == 1:
                                                  if bulle_rect.collidepoint(event.pos):
                                                      print("touché")
                      
                      
                                                  else:
                                                      print("raté")
                                                      running = False
                                                      pygame.quit()
                                              else:
                                                  print("raté")
                                                  running = False
                                                  pygame.quit()
                                          
                      
                      
                      
                      
                                          # evenement est fermeture de fenêtre
                                          if event.type == pygame.QUIT:
                                              running = False
                                              pygame.quit()
                      
                          #opacité
                          if alpha >= 0 and fade_in is True:
                              alpha += 5
                              if alpha >= 255:
                                  alpha = 255
                                  fade_in = False
                      
                          #opacité
                          if alpha <= 255 and fade_in is False:
                              alpha -= 5
                              if alpha <= 0:
                                  alpha = 0
                                  fade_in = True
                          #affichage du texte + du fond d'écran d'accueil
                          txt_surf = orig_surf.copy()
                          alpha_surf.fill((255, 255, 255, alpha))
                          txt_surf.blit(alpha_surf, (0, 0), special_flags=pygame.BLEND_RGBA_MULT)
                          screen.blit(a1, (0, 0))
                          screen.blit(txt_surf, (280, 725))
                          pygame.display.flip()
                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 juillet 2021 à 17:53:39

                        Code monolithique, variables inutilisées, boucle infinie, "mes bases je les connais" ...
                        • Partager sur Facebook
                        • Partager sur Twitter

                        "il vaut mieux vivre en France qu'en Italie, la France a de plus jolies prisons"

                          23 juillet 2021 à 18:26:27

                          ok je vais me débrouiller seul

                          -
                          Edité par HugoCam__ 23 juillet 2021 à 18:45:41

                          • Partager sur Facebook
                          • Partager sur Twitter
                            23 juillet 2021 à 18:26:54

                            HugoCam__ a écrit:

                            c'est pas ça le problème mes bases je les connais et je sais ce que c'est une boucle et des conditions, et je sais que quand mon code est fini ça revient a mon while, mais le problème est que je ne comprends pas pourquoi ça revient au while alors que j'ai précisé (maintenant) que pour revenir au while il faut un clic gauche dans le cercle

                            Mais ce n'est pas ce que tu fais..... ce que tu fais: tu attends un évènement (ligne 67), tu le traites (ligne 68 et suivantes), tu continues (donc retour au début du while)

                            • Partager sur Facebook
                            • Partager sur Twitter
                              23 juillet 2021 à 20:10:56

                              je ne comprends pas bien... voilà mon code, le problème est que n'importe quelle action que je fais ça revient au while alors que j'ai pourtant préciser qu'il fallait un clique gauche et dans le rond...
                                              while a < b:
                                                  screen.blit(bg, (0, 0))
                                                  pygame.display.flip()
                                                  #position du x
                                                  xbulle = random.randint(1, 1100)
                                                  print(xbulle)
                                                  #position du y
                                                  ybulle = random.randint(1, 700)
                                                  print(ybulle)
                                                  #apparition de la bulle
                                                  bulle_rect.x = xbulle
                                                  bulle_rect.y = ybulle
                                                  screen.blit(bulle, bulle_rect)
                                                  pygame.display.flip()
                                                  event1 = pygame.event.wait()
                                                  if event1.type == MOUSEBUTTONDOWN:
                                                      if event1.button == 1:
                                                          if bulle_rect.collidepoint(event1.pos):
                                                              print("touché")
                              
                                                          else:
                                                              print("raté2")
                                                              running = False
                                                              pygame.quit()

                              -
                              Edité par HugoCam__ 23 juillet 2021 à 20:11:17

                              • Partager sur Facebook
                              • Partager sur Twitter
                                24 juillet 2021 à 2:17:05

                                Un tuto qui a l'air pas mal. Je suis en train de le suivre : https://www.patternsgameprog.com/series/discover-python-and-patterns/ (EN)

                                C'est progressif et il y a la base. Tu peux faire des aller-retours si tu veux.

                                Le tuto provient du site de pygame.

                                import pygame as pg
                                from random import randint
                                
                                pg.init()
                                clock = pg.time.Clock()
                                fps = 60
                                width = 640
                                height = 480
                                
                                left_click = 1 # button 1 est le clic gauche
                                window = pg.display.set_mode((width,height))
                                
                                blue = 0,0,255
                                fill_color = (128,128,128)
                                running = True
                                
                                square_size = 20
                                
                                x = randint(0,width-square_size)
                                y = randint(0,height-square_size)
                                
                                square = pg.draw.rect(window, (blue), (x,y,square_size,square_size))
                                pg.display.update()
                                
                                while running:
                                  for event in pg.event.get():
                                    if event.type == pg.QUIT:
                                      running = False
                                    elif event.type == pg.MOUSEBUTTONDOWN:
                                      if event.button == left_click: # button 1 est le clic gauche
                                        if square.collidepoint(event.pos):
                                          print("inside")
                                          x = randint(0,width-square_size)
                                          y = randint(0,height-square_size)
                                        else:
                                          print("outside")
                                      else:
                                        print("wrong button !")
                                
                                  window.fill(fill_color)
                                
                                  square = pg.draw.rect(window, (blue), (x,y,square_size,square_size))
                                  pg.display.update()
                                  clock.tick(fps)
                                
                                pg.quit()

                                Voici ce que j'ai fait. Dans mon jeu, on clique gauche sur le carré, on indique qu'on a cliqué à l'intérieur et le carré change de place, sinon, on indique si on a cliqué à l'extérieur ou avec le mauvais clic.

                                Mon jeu est testable car il n'y a pas d'image comme dans ton code. Règle d'or : quand on demande de l'aide, on propose un code testable sans contrainte. Une image n'est pas indispensable, elle est remplaçable par une forme géométrique (carré, rectangle, ...).

                                -
                                Edité par CristianoRolando 24 juillet 2021 à 3:10:27

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  26 juillet 2021 à 15:13:43

                                  HugoCam__ a écrit:

                                  je ne comprends pas bien... voilà mon code, le problème est que n'importe quelle action que je fais ça revient au while alors que j'ai pourtant préciser qu'il fallait un clique gauche et dans le rond...

                                                  while a < b:
                                                      ...
                                                      pygame.display.flip()
                                                      event1 = pygame.event.wait()
                                                      if event1.type == MOUSEBUTTONDOWN:
                                                          if event1.button == 1:
                                                              if bulle_rect.collidepoint(event1.pos):
                                                                  print("touché")
                                  
                                                              else:
                                                                  print("raté2")
                                                                  running = False
                                                                  pygame.quit()

                                  -
                                  Edité par HugoCam__ 23 juillet 2021 à 20:11:17

                                  Non tu ne précises pas qu'il faut un clic gauche dans le rond pour revenir au début.

                                  "event1 = pygame.event.wait()" attend un événement (n'importe lequel)

                                  le code qui suit cette attente teste l'événement si il correspond à ce que l'on veut, si c'est le cas, on fait les actions correspondantes; sinon bah, on poursuit.

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Pygame, attendre qu'un événement se produise

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  • Editeur
                                  • Markdown