Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pygame / Python Help :p

Personnage qui tire

    16 septembre 2017 à 13:46:17

    Salut ! 

    J'ai besoin d'aide. J'ai crée un petit programme ou j'ai crée un cube (le personnage) qui doit esquiver des obstacles qui arrive dessus (d'autre cube).

    Je voudrais que lorsque que j'appuie sur espace , le personnage envoie un projectile (une balle de pistolé). Comment faire ? je bloque :/

    • Partager sur Facebook
    • Partager sur Twitter
      16 septembre 2017 à 22:35:01

      Tu utilise les évenements ? si oui:

      for event in pygame.event.get():
          if event.type == KEYDOWN and event.key == K_SPACE:
               #tu met ici le tir de ta balle



      -
      Edité par Coliculus 16 septembre 2017 à 22:35:50

      • Partager sur Facebook
      • Partager sur Twitter
        17 septembre 2017 à 15:47:49

        elif event.type == KEYDOWN and event.key == K_SPACE:
             if event.key == K_SPACE:
                balle
                pos2_x += droite[0]
                pos2_y += droite[1]
        

        quand j'appuie sur espace il avance qu'une fois est pas en continue...

        -
        Edité par JohanDelcourt 17 septembre 2017 à 17:13:23

        • Partager sur Facebook
        • Partager sur Twitter
          18 septembre 2017 à 16:18:00

          Salut,

          Pour répondre à votre dernière question, vous devez utiliser une autre méthode de captures des touches. Puisque, votre gestions des événements se font dans une boucle FOR, vous pourrez pas capturer les touches en continue. Vous devez changer ce principe.

          On se sert de pygame.key.get_pressed()

          Normalement, on peut faire ceci:

          import pygame
          
          def gerer_main_events():
              global RUNNING
              for event in pygame.event.get():
                  if event.type == pygame.QUIT:
                      RUNNING = False
          
          def gerer_joueur_events():
              ## Pour le clavier (keyboard)
              clavier = pygame.key.get_pressed()
              if clavier[pygame.K_UP]:
                  print('touche du haut')
              if clavier[pygame.K_DOWN]:
                  print('touche du bas')
          
              ## Pour la souris (mouse)
              if pygame.mouse.get_focused():
                  souris = pygame.mouse.get_pressed()
                  position = pygame.mouse.get_pos()
                  if souris[0]: # Gauche
                      print('clique de gauche', position)
                  if souris[1]: # Milieu
                      print('clique de milieu', position)
                  if souris[2]: # Droite
                      print('clique de droite', position)
          
          
          RUNNING = True
          while RUNNING:
              gerer_main_events()
          
              gerer_joueur_events()

          Vous pouvez donc utiliser deux méthodes. Sans boucle for, permet d'appuyer en continue

          Ensuite, pour votre première question, votre problème, c'est simplement, que les projectiles, doivent être indépendant, des mouvements du joueur. 

          Je ne sais pas, si vous connaissez les sprites et les groupes de sprites, mais ce que vous demander serait 100x plus simple par les sprites (Ils sont prévus, pour ce genre de chose, surtout pour les collisions entre groupe ou sprites.).

          Lorsque vous appuyez sur espace (tirer), le joueur doit simplement, ajouter un projectile dans une liste(un groupe). Donc, puisque vous êtes déjà dans une grande boucle WHILE, cette liste s'actualise. Puisqu'ils sont indépendant, ils pourront avancer ou s'enlever, séparément et automatiquement.

          Exemples, sans classe sprites (disont que c'est pas trop conseillé, de refaire la roue):

          Si vous êtes pour prendre cet exemple, je vous invites à regarder vivement les sprites.

          import pygame
          
          pygame.init()
          ...
          
          fenetre = pygame.display.set_mode((400, 400))
          ...
          
          joueur = pygame.image.load('joueur.png')
          joueur_rect = joueur.get_rect()
          
          
          projectiles_groupe = []
          
          image_projectile = pygame.image.load('projectile.png')
          
          def launch_projectile(x, y):
              rect = image_projectile.get_rect() ## Position du projectile à lancer
              rect.topleft = (x, y)
              return [image_projectile, rect]
          
          
          def gerer_joueur_events():
              pressed = pygame.key.get_pressed()
              if pressed[pygame.K_LEFT]:
                  joueur_rect.x -= 1
              if pressed[pygame.K_RIGHT]:
                  joueur_rect.x += 1
          
              if pressed[pygame.K_SPACE]:
                 ## créer une projectile, selon la position du joueur (x, y)
                  projectile = launch_projectile(joueur_rect.x,
                                                 joueur_rect.y)
                  ## Sauvegarde le projectile dans la liste
                  projectiles_groupe.append(projectile)
          
          def detect_projectiles():
              for projectile, rectangle in projectiles_groupe:
                  rectangle.y += 1
          
                  if rectangle.y <= 0: ## Touche le haut.
                      projectiles_groupe.remove([projectile,
                                                 rectangle])
          
                  fenetre.blit(projectile, rectangle)
          
          
          while True:
              fenetre.blit(joueur, joueur_rect)
              gerer_joueur_events()
          
              detect_projectiles()
          
              pygame.display.flip()
          
          pygame.quit()

          Il manque peut-être les autres fonctions, que j'ai donnée en exemple, plus haut.. à vous de voir.

          Comme je vous dis, ce n'est pas le meilleur moyen, puisque les sprites, font ce même travail.

          Exemple, avec le code du haut.

          ...
          
          projectiles_groupe = pygame.sprite.Group()
          
          class Projectile(pygame.sprite.Sprite):
              def __init__(self, position, vitesse=5):
                  super().__init__()
          
                  self.position = position
                  self.vitesse = vitesse
          
                  self.image = pygame.image.load('projectile.png')
                  self.rect = self.image.get_rect()
                  
                  self.rect.topleft = position
          
              def update(self):
                  self.rect.y -= self.vitesse
          
          def gerer_joueur_events():
              pressed = pygame.key.get_pressed()
              if pressed[pygame.K_SPACE]:
                  projectile = Projectile([joueur_rect.x,
                                           joueur_rect.y])
                  projectiles_groupe.add(projectile)
          
          def detect_projectiles():
              for projectile in projectiles_groupe:
                  if projectile.rect.y <= 0:
                      projectiles_groupe.remove(projectile)
          
          while True:
              fenetre.blit(joueur, joueur_rect)
              gerer_joueur_events()
          
              ## Blit les projectiles, par le groupe sprite
              projectiles_groupe.draw(fenetre)
              ## Exécute tous les update() de chaque sprite du groupe
              projectiles_groupe.update()
          
          
              detect_projectiles()
          
              pygame.display.flip()
          
          pygame.quit()

          En fait, le groupe permet de blitter directement, par une méthode. À la place d'utilise une boucle FOR, pour le faire. De plus, il permet de mieux gérer les collision, une fois que vous aurez les obstacles.

          J'Espère que cela vous aidera.

          Bonne chance

          A+

          -
          Edité par nolimitech 18 septembre 2017 à 16:25:03

          • Partager sur Facebook
          • Partager sur Twitter

          Pygame / Python Help :p

          × 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