Partage
  • Partager sur Facebook
  • Partager sur Twitter

Besoin d'aide pour un programme python

Deuxième personnage n'apparait pas

    30 janvier 2016 à 17:38:02

    Bonjour,

    Voila, après avoir réaliser des programmes très basiques,j'ai décider de faire  un petit jeux dans lequel s'affronte deux véhicules malheureusement seule un d'entre eux apparait,je voulais donc savoir pourquoi?

    Merci d'avance

    Je laisse le programme en bas:

    import pygame
    
    import sys
    
    from pygame.locals import *
    
     
    
    ## Initialisation de la fenetre 
    
    pygame.init()
    
     
    
    #Création de la fenêtre
    
    largeur = 1200
    
    hauteur = 900
    
    fenetre=pygame.display.set_mode((largeur,hauteur),FULLSCREEN)
    
     
    
    #Titre de la fenêtre
    
    pygame.display.set_caption('Tank vs Plane')
    
     
    
    #Lecture de l'image de fond
    
    fond = pygame.image.load("background.png").convert()
    
    fenetre.blit(fond, (0,0))
    
     
    
    #Délai de répétition du clavier
    
    pygame.key.set_repeat(1,12)
    
     
    
    #Temps de rafraîchissement
    
    clock = pygame.time.Clock()
    
     
    
     
    
    #Classe Bloc
    
    class Bloc(Rect, object):
    
         
    
        #Initialisation du sprite et rect
    
        def __init__(self, image, rect):
    
            Rect.__init__(self, rect)
    
            self.image = pygame.image.load(image).convert()
    
     
    
     
    
        #Méthode de collage des objets Bloc
    
        def draw(self):
    
            fond.blit(self.image, self)
    
     
    
     
    
    #Classe Tank
    
    class Tank(Rect, object):
    
         
    
        #Sprites et Rect 
    
        def __init__(self, droite, haut, bas, gauche):
    
            self.droite = pygame.image.load(droite).convert_alpha()
    
            self.haut = pygame.image.load(haut).convert_alpha()
    
            self.bas = pygame.image.load(bas).convert_alpha()
    
            self.gauche = pygame.image.load(gauche).convert_alpha()
    
            self.direction = self.droite
    
            Rect.__init__(self, self.direction.get_rect())
    
     
    
     
    
        #Changement de direction et préparation du déplacement
    
        def deplacement(self, event, mur=None):
    
            if not mur: mur=()
    
            if event.key == K_RIGHT:
    
                x,y = 2,0
    
                self.direction = self.droite 
    
            elif event.key == K_UP:
    
                x,y = 0,-2
    
                self.direction = self.haut
    
            elif event.key == K_DOWN:
    
                x,y = 0,2
    
                self.direction = self.bas
    
            elif event.key == K_LEFT:
    
                x,y = -2,0
    
                self.direction = self.gauche
    
            else: return
    
     
    
            #Si aucune collision, déplacement à la nouvelle position
    
            collision_index = self.move(x,y).collidelist(mur)
    
            if collision_index == -1:
    
                self.move_ip(x,y)
    
                return True
    
     
    
     #Classe avion
    
    class Avion(Rect, object):
    
         
    
        #Sprites et Rect 
    
        def __init__(self, droite, haut, bas, gauche):
    
            self.droite = pygame.image.load(droite).convert_alpha()
    
            self.haut = pygame.image.load(haut).convert_alpha()
    
            self.bas = pygame.image.load(bas).convert_alpha()
    
            self.gauche = pygame.image.load(gauche).convert_alpha()
    
            self.direction = self.droite
    
            Rect.__init__(self, self.direction.get_rect())
    
     
    
     
    
        #Changement de direction et préparation du déplacement
    
        def deplacement(self, event, mur=None):
    
            if not mur: mur=()
    
            if event.key == K_f:
    
                x,y = 2,0
    
                self.direction = self.droite 
    
            elif event.key == K_e:
    
                x,y = 0,-2
    
                self.direction = self.haut
    
            elif event.key == K_d:
    
                x,y = 0,2
    
                self.direction = self.bas
    
            elif event.key == K_s:
    
                x,y = -2,0
    
                self.direction = self.gauche
    
            else: return
    
     
    
            #Si aucune collision, déplacement à la nouvelle position
    
            collision_index = self.move(x,y).collidelist(mur)
    
            if collision_index == -1:
    
                self.move_ip(x,y)
    
                return True
    
     
    
    #Classe obus
    
    # Classe obus
    
    class Obus(pygame.sprite.Sprite):
    
      
    
        #Sprites et Rect
    
        def __init__(self, angle, image):
    
            pygame.sprite.Sprite.__init__(self)
    
             
    
            self.angle = angle
    
            self.image = pygame.image.load(image).convert_alpha()
    
            self.rect = self.image.get_rect()
    
      
    
        #Déplacement de l'obus
    
        def update(self):
    
            if self.angle == 'bas':
    
                self.rect.y += 4
    
            elif self.angle == 'haut':
    
                self.rect.y -= 4       
    
            elif self.angle == 'droite':
    
                self.rect.x += 4
    
            elif self.angle == 'gauche':
    
                self.rect.x -= 4
    
     
    
    # Création de l'obus
    
    def tir_obus(direction):
    
        if direction == 'bas':
    
            obus = Obus(direction, "obus_bas.png")
    
            obus.rect.x = tank.x + 12
    
            obus.rect.y = tank.y + 24
    
        elif direction == 'haut':
    
            obus = Obus(direction, "obus_haut.png")   
    
            obus.rect.x = tank.x + 12
    
            obus.rect.y = tank.y - 8
    
        elif direction == 'droite':
    
            obus = Obus(direction, "obus_droite.png")
    
            obus.rect.x = tank.x + 12
    
            obus.rect.y = tank.y + 24
    
        elif direction == 'gauche':
    
            obus = Obus(direction, "obus_gauche.png")   
    
            obus.rect.x = tank.x - 9
    
            obus.rect.y = tank.y + 4
    
        obus_liste.add(obus) 
    
     
    
        #Définition de l'image de l'obus en fonction de la direction du vehicule 
    
        def angle(self, angle):
    
            if self.angle == 'droite':
    
                self.image = self.droite
    
            if self.angle == 'haut':
    
                self.image = self.haut
    
            if self.angle == 'bas':
    
                self.image = self.bas
    
            if self.angle == 'gauche':
    
                self.image = self.gauche
    
     
    
         
    
        #Déplacement de l'obus
    
        def update(self):
    
            if self.image == self.bas:
    
                self.rect.y += 4
    
            if self.image == self.haut:
    
                self.rect.y -= 4
    
            if self.image == self.qauche:
    
                self.rect.x -= 4
    
            if self.image == self.droite:
    
                self.rect.x += 4
    
     
    
     
    
    #Création des murs
    
    mur1 = Bloc("mur1.png", (160,160,92,32))
    
    mur2 = Bloc("bloc.png", (252,192,32,32))
    
     
    
    #Collage de chaque mur
    
    def redraw():
    
        mur1.draw()
    
        mur2.draw()
    
     
    
    #Création du tank et position de départ
    
    tank = Tank("tank_droite.png", "tank_haut.png", "tank_bas.png", "tank_gauche.png")
    
    tank.center = 40, 40
    
     
    
    #Création de l'avion et position de départ
    
    avion = Avion("avion_droite.png", "avion_haut.png", "avion_bas.png", "avion_gauche.png")
    
    avion.center = 40, 50
    
     
    
    #Liste des obstacles rencontrés par le tank
    
    obstacles = (mur1, mur2)
    
     
    
    #Liste des obus créés
    
    obus_liste = pygame.sprite.Group()
    
     
    
    #Délai de tir d'obus
    
    delai_tir = pygame.time.get_ticks()
    
     
    
    #Collage de tous les murs
    
    redraw()
    
     
    
    #Boucle principale
    
    while 1:   
    
        for event in pygame.event.get():
    
     
    
            #Quitter le jeu
    
            if event.type == QUIT:
    
                sys.exit()
    
                 
    
            #Si déplacement possible, recollage du vehicule
    
            if event.type == KEYDOWN:
    
                if tank.deplacement(event, obstacles):
    
                    fenetre.blit(tank.direction, tank)
    
                if avion.deplacement (event, obstacles):
    
                    fenetre.blit(avion.direction, avion)
    
     
    
            #Si touche espace pressée, tir d'un obus et reset du délai   
    
            if event.type == KEYDOWN:
    
                if event.key == K_SPACE and pygame.time.get_ticks() - delai_tir > 1000:
    
     
    
                    delai_tir = pygame.time.get_ticks()
    
                     
    
                    if tank.direction == tank.bas:
    
                        tir_obus('bas')
    
                    if tank.direction == tank.haut:
    
                        tir_obus('haut')
    
                    if tank.direction == tank.gauche:
    
                        tir_obus('gauche')
    
                    if tank.direction == tank.droite:
    
                        tir_obus('droite')
    
             #Si touche espace pressée, tir d'un obus et reset du délai   
    
            if event.type == KEYDOWN:
    
                if event.key == K_q and pygame.time.get_ticks() - delai_tir > 1000:
    
     
    
                    delai_tir = pygame.time.get_ticks()
    
                     
    
                    if avion.direction == avion.bas:
    
                        tir_obus('bas') 
    
                    if avion.direction == avion.haut:
    
                        tir_obus('haut')
    
                    if avion.direction == avion.gauche:
    
                        tir_obus('gauche')
    
                    if avion.direction == avion.droite:
    
                        tir_obus('droite')
    
     
    
        #Mise a jour du déplacement des obus
    
        obus_liste.update()
    
     
    
        #Limite de FPS
    
        clock.tick(60)
    
     
    
        #Recollage et rafraîchissement
    
        fenetre.blit(fond, (0,0))
    
        fenetre.blit(tank.direction, tank)
    
        obus_liste.draw(fenetre)
    
        pygame.display.flip()



    -
    Edité par AaaBbb30 30 janvier 2016 à 18:55:26

    • Partager sur Facebook
    • Partager sur Twitter
      30 janvier 2016 à 17:40:51

      Bonjour

      Mets ton code entre balises

      Merci

      @+

      • Partager sur Facebook
      • Partager sur Twitter
      http://sinclair.recreatedzxspectrum.com/index.php
        30 janvier 2016 à 19:42:08

        ligne 521: tu ne réaffiches que le tank. Où est passé l'avion?
        • Partager sur Facebook
        • Partager sur Twitter
        Précepte: Le mieux est l'ennemi du bien
          30 janvier 2016 à 20:57:49

          Merci beaucoup,le problème est réglé ,je dois avouer qu'il était assez bête.

          -
          Edité par AaaBbb30 31 janvier 2016 à 0:25:32

          • Partager sur Facebook
          • Partager sur Twitter
            31 janvier 2016 à 0:28:49

            Mon problème est maintenant résolu,j'ai pu modifier mais je ne comprend pas bien comment utiliser collision de pygame dans le but de remplacer l'image du tank ou de l'avion une fois que l'obus l'a percuter par une image d'explosion.
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              31 janvier 2016 à 11:11:10

              Je n'ai pas regardé le code, je vais parler ici d'un principe simple à appliquer dans le cas d'une collision avec pygame

              En imaginant la détection entre deux objets, il suffit de connaître leurs coordonnées, c'est le cas avec l'objet créé Rect de pygame.

              Une fois ces deux objets, on peut utiliser la méthode colliderect de l'objet Rect qui permettra de détecter la collision.

              detectedCollision = ob1.colliderect(ob2)
              
              if detectedCollision:
                  # Agir dans le cas d'une collision
              
              else:
                  # continuer



              • Partager sur Facebook
              • Partager sur Twitter
                31 janvier 2016 à 16:36:48

                J'avais déjà essayer cette technique mais le programme ne fonctionne pas et je ne vois pas l'erreur:
                detectedCollision = self.move(x,y).collidelist(obus_list)
                        if detectedCollision:
                        avion = Avion("explosion.png")
                        
                detectedCollision =self.move(x,y).collidelist(obus2_list)
                        if detectedCollision:
                        tank = Tank("explosion2.png")

                -
                Edité par AaaBbb30 31 janvier 2016 à 16:37:48

                • Partager sur Facebook
                • Partager sur Twitter
                  31 janvier 2016 à 16:45:14

                  La méthode collidelist attend en argument une liste. Toi tu lui donnes un objet de la classe Group. Le problème peut peut-être venir de là :o
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Précepte: Le mieux est l'ennemi du bien
                    1 février 2016 à 0:24:23

                    Merci pour ton aide mais malgré le fait que j'ai essayé différentes configurations, cela ne fonctionne pas.Cependant, je pense que le problème vient plutôt de la ligne 3 et 7 car e reçois un message disant:

                    • Partager sur Facebook
                    • Partager sur Twitter
                      1 février 2016 à 0:55:31

                      indented ressemble baucoup à indentation tu ne trouves pas? Avec en plus le surlignage en rouge, je pense que tu es fatigué, un petit somme et ça ira tout seul. ;)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        1 février 2016 à 1:39:12

                        Et accessoirement, tu risques d'avoir un autre petit problème 3 lignes plus bas :p
                        • Partager sur Facebook
                        • Partager sur Twitter
                          1 février 2016 à 9:03:16

                          La prochaine fois donne directement le message d'erreur, car effectivement ça n'a aucun rapport avec pygame :-°. C'est juste un problème de syntaxe ;)
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Précepte: Le mieux est l'ennemi du bien
                            14 février 2016 à 16:53:06

                            Bonjour,

                            Je suis encore de retour parce que j'ai un petit problème: lorsque je lance le jeu on jeu soit jouer avec le tank soit avec l'avion et pas les deux en meme temps? Existe-t-il un moyen de régler ce problème

                            Merci

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Besoin d'aide pour un programme python

                            × 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