Partage
  • Partager sur Facebook
  • Partager sur Twitter

fonction en même temps que prgm principal

    18 octobre 2020 à 15:07:34

    Bonjour, dans le cadre d'un projet en cours je créé un jeu vidéo (petit bien évidemment). J'utilise pygame et vient un moment où j'ai besoin que mon personnage puisse attaquer les ennemis. Mon problème est donc que j'aimerais que les ennemis continuent de suivre mon personnage donc que la boucle principale continue mais qu'en même temps, une autre boucle fasse l'animation d'attaque de mon personnage. J'ai essayé plusieurs trucs mais sans résultats. J'ai aussi regardé ce que je pouvais faire avec les threads mais le problème étant qu'ils bloquent le programme principal (et mettre celui-ci en thread ne serait pas très pratique je pense)

    Voici un partie du main :

    while launcher:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:     # Detection si le joueur reste appuyé sur une touche
                if event.key == pygame.K_ESCAPE:  # pouvoir sortir du programme
                    launcher = False
                elif event.key == pygame.K_x:
                    game.link.attaque(frame)
                else:
                    game.appuyer[event.key] = True
            elif event.type == pygame.KEYUP:        # Detection si le joueur lache la touche
                game.appuyer[event.key] = False
    
    
        if game.appuyer.get(pygame.K_RIGHT):  # Touche droite
            game.link.deplacement_droite(frame)
        if game.appuyer.get(pygame.K_LEFT):  # Touche gauche
            game.link.deplacement_gauche(frame)
        if game.appuyer.get(pygame.K_UP):  # Touche haut
            game.link.deplacement_haut(frame)
        if game.appuyer.get(pygame.K_DOWN):  # Touche bas
            game.link.deplacement_bas(frame)
    
        clock += 1
        if clock > nextframe:
            frame = (frame+1)%8     # permet de modifier les sprites de link pendant son mouvement
            nextframe += 3
    
    
        screen.blit(maison, ((size[0]-(size[1]*950//650))//2, 0))     # afficher l'arrière plan
    
    
        screen.blit(game.link.image, game.link.rect)  # afficher link
        game.tout_les_monstres.draw(screen)  # afficher les monstres
    
        screen.blit(feuillage, (382, 155))
        screen.blit(feuillage, (875, 155))
    
        for monstre in game.tout_les_monstres:
            monstre.trajectoire(game.link.rect.x, game.link.rect.y, frame)
    
        pied_gauc = pygame.Rect(game.link.rect.x+7, game.link.rect.y+40, 15, 9)
        pied_droi = pygame.Rect(game.link.rect.x+11, game.link.rect.y+40, 19, 9)
        pied_haut = pygame.Rect(game.link.rect.x+11, game.link.rect.y+36, 15, 9)
        pied_bass = pygame.Rect(game.link.rect.x+11, game.link.rect.y+40, 15, 13)
    
    
        for objet in collision:
            if pied_gauc.colliderect(objet):
                game.link.rect.x += game.link.vitesse
            if pied_droi.colliderect(objet):
                game.link.rect.x -= game.link.vitesse
            if pied_haut.colliderect(objet):
                game.link.rect.y += game.link.vitesse
            if pied_bass.colliderect(objet):
                game.link.rect.y -= game.link.vitesse
    
    
        pygame.display.flip()       # Mettre à jour l'image

    Et voici la classe link :

    class Link(pygame.sprite.Sprite):
        """
        gainvie = quand on gagne un coeur
        pertevie = quand on perde un coeur
        attaque = quand on attaque
        """
        def __init__(self):
            super().__init__()
            self.vie = 5
            self.degats = 1
            self.max_vie = 5
            self.vitesse = 4
            self.image = f1
            self.images_base =  [[d1, d2, d3, d4, d5, d6, d7, d8],
                                 [f1, f2, f3, f4, f5, f6, f7, f8],
                                 [fd1, fd2, fd3, fd4, fd5, fd6, fd5, fd6],
                                 [fg1, fg2, fg3, fg4, fg5, fg6, fg5, fg6]]
            self.images_attaque = [[epf1, epf1, epf2, epf3, epf4, epf5],
                                   [epd1, epd2, epd3, epd4, epd5, epd6],
                                   [epfd1, epfd2, epfd3, epfd4, epfd5, epfd6],
                                   [epfg1, epfg2, epfg3, epfg4, epfg5, epfg6]]
            self.rect = self.image.get_rect()
            self.rect.x = 600
            self.rect.y = 400
            self.action = 0
    
    
    
        def deplacement_droite(self, frame):       # deplacement droit
            self.rect.x += self.vitesse
            self.image = self.images_base[2][frame]
    
        def deplacement_gauche(self, frame):       # deplacement gauche
            self.rect.x -= self.vitesse
            self.image = self.images_base[3][frame]
    
        def deplacement_haut(self, frame):     # deplacement haut
            self.rect.y -= self.vitesse
            self.image = self.images_base[0][frame]
    
        def deplacement_bas(self, frame):      # deplacement bas
            self.rect.y += self.vitesse
            self.image = self.images_base[1][frame]
    
        def gainvie(self, gain):
            self.vie += gain
    
        def pertevie(self, perte):
            self.vie -= perte
    
        def attaque(self, frame):
            self.action += 1
            self.image = self.images_attaque[0][self.action]    # ceci ne fonctionne pas du coup
    


    Merci de votre aide.

    -
    Edité par MGS5 18 octobre 2020 à 15:07:55

    • Partager sur Facebook
    • Partager sur Twitter

    fonction en même temps que prgm principal

    × 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