Problème de Compteur et de boucle...

Résolu/Fermé
PY2019 Messages postés 17 Date d'inscription mercredi 24 avril 2019 Statut Membre Dernière intervention 29 avril 2019 - 28 avril 2019 à 19:11
PY2019 Messages postés 17 Date d'inscription mercredi 24 avril 2019 Statut Membre Dernière intervention 29 avril 2019 - 29 avril 2019 à 14:00
Bonjour,

Je prépare un jeu dans le cadre d'une épreuve de bac dans lequel une voiture se déplace pour éviter des obstacles. Si elle en rencontre un, un écran game over s'affiche et le programme principal repars du début. Seulement voilà, il faut que le jeux se termine à un moment, j'ai donc créé un écran victoire et une ligne d'arrivée :

class lignearrivee (pygame.sprite.Sprite):
    """classe pour la ligne d arrivee"""

    # initialisation
    def __init__(self):
        super().__init__()
        self.image=pygame.image.load('ligne arrivee.png').convert_alpha() #image de ligne
        self.rect = self.image.get_rect()
        self.rect.y=-100
        self.rect.x=250

    def update(self):
        self.rect.y+=1
        if self.rect.y>600:
            self.kill()

def victoire():
    pygame.init()
    screen = pygame.display.set_mode((900,600),0,32)
    pygame.display.set_caption("Josette en voiture !")
    victoire1=pygame.image.load('ecranvictoire.png').convert_alpha()
    screen.blit(victoire1, (0, 0))
    pygame.display.update()
    reprendre=1
    while reprendre:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                reprendre=0
            # touches enfoncees
            if event.type == pygame.KEYDOWN:
                reprendre=0
                intro()


Mais je ne parviens pas à appliquer mon idée: je souhaite faire apparaître la ligne d'arrivée au bout d'un certain temps (définis à l'aide d'un compteur), puis que ma fonction victoire s'applique quelques secondes après.. ( le temps que la voiture passe la ligne).

Voici mon programme principal (avec la ligne d'arrivée qui passe en boucle):
def main():
    """programme principal"""
    pygame.init()

    #definition de la fenetre
    screen= pygame.display.set_mode((900, 600),0,32)
    pygame.display.set_caption("josette en voiture")
    fond=pygame.image.load('fondforet.png').convert_alpha() #chargement et collage du fond
    arrivee=pygame.image.load('ligne arrivee.png').convert_alpha()
    son_fond.play()

    #creation des listes de sprites
    active_sprite_list = pygame.sprite.Group()
    liste_lignes=pygame.sprite.Group()
    Obstacles_sprite_list= pygame.sprite.Group()

    # creation voiture
    voiture = Voiture()
    voiture.rect.x = 300
    voiture.rect.y = 300
    active_sprite_list.add(voiture)

    #lignes centrales
    compteurligne=0
    ligne=Line()
    ligne.rect.y=0
    liste_lignes.add(ligne)
    ligne=Line()
    ligne.rect.y=250
    liste_lignes.add(ligne)
    ligne=Line()
    ligne.rect.y=500
    liste_lignes.add(ligne)

    compteurbarriere1=0
    compteurbarriere2=0
    compteurdecors=0
    compteurdecors2=0
    compteurobstacle=0
    compteurarrivee=0

    #reglage de l'horloge
    clock = pygame.time.Clock()

    # Boucle principale
    continuer=1
    while continuer:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                continuer=0

            # touches enfoncees
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    voiture.mvtgauche()
                if event.key == pygame.K_RIGHT:
                    voiture.mvtdroit()
                if event.key == pygame.K_UP:
                    voiture.mvthaut()
                if event.key == pygame.K_DOWN:
                    voiture.mvtbas()

              # touches relevees
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT:
                    voiture.stop()
                if event.key == pygame.K_RIGHT:
                    voiture.stop()
                if event.key == pygame.K_UP:
                    voiture.stop()
                if event.key == pygame.K_DOWN:
                    voiture.stop()

        #lignes centrales
        compteurligne+=1.5
        if compteurligne>250:
           ligne=Line()
           liste_lignes.add(ligne)
           compteurligne=0

        #ligne arrivee
        compteurarrivee+=1
        if compteurarrivee>600:
            arrivee=lignearrivee()
            active_sprite_list.add(arrivee)
            compteurarrivee=0
##      if compteurarrivee>1000:
##         victoire()


        compteurbarriere1+=0.5
        if compteurbarriere1>45:
           barriere1=fence1()
           active_sprite_list.add(barriere1)
           compteurbarriere1=0
        compteurbarriere2+=0.5
        if compteurbarriere2>45:
           barriere2=fence2()
           active_sprite_list.add(barriere2)
           compteurbarriere2=0

        compteurdecors+=randint(1,10)*0.1
        if compteurdecors>100:
            choix=randint(1,15)
            if choix==1:
                arbre=arbre1()
                arbre.rect.x=randint(0,95)
                active_sprite_list.add(arbre)
            if choix==2:
                sapin1=sapin()
                sapin1.rect.x=randint(0,100)
                active_sprite_list.add(sapin1)
            if choix==3:
                arbrevert=arbre3()
                arbrevert.rect.x=randint(0,95)
                active_sprite_list.add(arbrevert)
            if choix==4:
                caillou=caillou1()
                caillou.rect.x=randint(0,95)
                active_sprite_list.add(caillou)
            if choix==5:
                buisson=buisson1()
                buisson.rect.x=randint(0,95)
                active_sprite_list.add(buisson)
            if choix==6:
                caillou3=caillou2()
                caillou3.rect.x=randint(0,90)
                active_sprite_list.add(caillou3)
            if choix==7:
                tronc3=tronc2()
                tronc3.rect.x=randint(0,90)
                active_sprite_list.add(tronc3)
            if choix==8:
                racine=racine1()
                racine.rect.x=randint(0,90)
                active_sprite_list.add(racine)
            if choix==9:
                tronc=tronc1()
                tronc.rect.x=randint(0,90)
                active_sprite_list.add(tronc)
            if choix==10:
                arbuste=arbre5()
                arbuste.rect.x=randint(0,105)
                active_sprite_list.add(arbuste)
            if choix==11:
                feuille=buisson2()
                feuille.rect.x=randint(0,95)
                active_sprite_list.add(feuille)
            if choix==12:
                arbuste2=arbre4()
                arbuste2.rect.x=randint(0,105)
                active_sprite_list.add(arbuste2)
            if choix==13:
                champi=champignon()
                champi.rect.x=randint(0,100)
                active_sprite_list.add(champi)
            if choix==14:
                souche1=souche()
                souche1.rect.x=randint(0,95)
                active_sprite_list.add(souche1)
            compteurdecors=0

        compteurdecors2+=randint(1,10)*0.1
        if compteurdecors2>100:
            choix=randint(1,3)
            if choix==1:
                arbre=arbre1()
                arbre.rect.x=randint(650,730)
                active_sprite_list.add(arbre)
            if choix==2:
                sapin1=sapin()
                sapin1.rect.x=randint(650,780)
                active_sprite_list.add(sapin1)
            if choix==3:
                arbrevert=arbre3()
                arbrevert.rect.x=randint(650,730)
                active_sprite_list.add(arbrevert)
            if choix==4:
                caillou=caillou1()
                caillou.rect.x=randint(650,730)
                active_sprite_list.add(caillou)
            if choix==5:
                buisson=buisson1()
                buisson.rect.x=randint(650,740)
                active_sprite_list.add(buisson)
            if choix==6:
                caillou3=caillou2()
                caillou3.rect.x=randint(650,760)
                active_sprite_list.add(caillou3)
            if choix==7:
                tronc3=tronc2()
                tronc3.rect.x=randint(650,730)
                active_sprite_list.add(tronc3)
            if choix==8:
                racine=racine1()
                racine.rect.x=randint(650,730)
                active_sprite_list.add(racine)
            if choix==9:
                tronc=tronc1()
                tronc.rect.x=randint(650,720)
                active_sprite_list.add(tronc)
            if choix==10:
                arbuste=arbre5()
                arbuste.rect.x=randint(650,780)
                active_sprite_list.add(arbuste)
            if choix==11:
                feuille=buisson2()
                feuille.rect.x=randint(650,740)
                active_sprite_list.add(feuille)
            if choix==12:
                arbuste2=arbre4()
                arbuste2.rect.x=randint(650,780)
                active_sprite_list.add(arbuste2)
            if choix==13:
                champi=champignon()
                champi.rect.x=randint(650,760)
                active_sprite_list.add(champi)
            if choix==14:
                souche1=souche()
                souche1.rect.x=randint(650,750)
                active_sprite_list.add(souche1)
            compteurdecors2=0

        compteurobstacle+=randint(1,10)*0.1
        if compteurobstacle>200:
            choix=randint(1,6)
            if choix==1:
                vache1=vache()
                vache1.rect.x=randint(250,560)
                active_sprite_list.add(vache1)
                Obstacles_sprite_list.add(vache1)
            if choix==2:
                cheval1=cheval()
                cheval1.rect.x=randint(250,560)
                active_sprite_list.add(cheval1)
                Obstacles_sprite_list.add(cheval1)
            if choix==3:
                cerf1=cerf()
                cerf1.rect.x=randint(250,560)
                active_sprite_list.add(cerf1)
                Obstacles_sprite_list.add(cerf1)
            if choix==4:
                mouton1=mouton()
                mouton1.rect.x=randint(250,560)
                active_sprite_list.add(mouton1)
                Obstacles_sprite_list.add(mouton1)
            if choix==5:
                herisson1=herisson()
                herisson1.rect.x=randint(250,560)
                active_sprite_list.add(herisson1)
                Obstacles_sprite_list.add(herisson1)
            compteurobstacle=0

        #mise a jour des sprites
        active_sprite_list.update()
        liste_lignes.update()


        #Gestion des collisions
        """collision voiture obstacle"""
        hit_list = pygame.sprite.spritecollide(voiture,Obstacles_sprite_list,False)
        for hit in hit_list:
         son_boum.play()
         fondgameover=pygame.image.load('ecrangameover.png').convert_alpha()
         screen.blit(fondgameover,(0, 0))
         pygame.display.update()
         pygame.time.delay(4000)
         main()
         return

        # On limite le nombre d'images a 60 images par seconde
        clock.tick(400)

        # affichage
        screen.blit(fond,(0,0))
        liste_lignes.draw(screen)
        active_sprite_list.draw(screen)

        pygame.display.flip()

pygame.quit()


Mon soucis est que je n'arrive pas a afficher la ligne d'arrivée et la faire défiler un seule fois. C'est un soucis car si je remet le compteur à 0, je n'afficherai jamais l'écran victoire. Mais je ne réussi pas à la faire défiler une seule fois car si je ne remet pas le compteur à 0, elle s'affiche en continue..

J'ai besoin d'un coup de main, alors n'hésitez pas si vous avez un peu de temps et une bonne maîtrise de pygame :))

1 réponse

quent217 Messages postés 421 Date d'inscription vendredi 25 septembre 2015 Statut Membre Dernière intervention 1 mars 2024 344
28 avril 2019 à 21:44
Bonjour,
Si vous ne remettez pas la valeur à 0, la ligne ne s'affiche pas en continue, elle apparait au bout de 600 étapes de boucle. Ensuite si vous arretez le déplacement de la voiture et affichez l'écran de victoire, elle ne sera pas réaffichée.
1
PY2019 Messages postés 17 Date d'inscription mercredi 24 avril 2019 Statut Membre Dernière intervention 29 avril 2019
28 avril 2019 à 23:34
oui mais je ne vois pas comment afficher l'écran victoire à compteur de 650 par exemple, si le compteur revient toujours à 0 après 600...
0
PY2019 Messages postés 17 Date d'inscription mercredi 24 avril 2019 Statut Membre Dernière intervention 29 avril 2019
28 avril 2019 à 23:55
Bon j'ai réussi à me débrouiller en ajoutant un nouveau compteur..

 #ligne arrivee
        compteurarrivee+=1
        if compteurarrivee>3000:
            arrivee=lignearrivee()
            active_sprite_list.add(arrivee)
            compteurarrivee=0

        #victoire
        compteurarrivee2+=1
        if compteurarrivee2>3700:
           victoire()


Maintenant j'ai à nouveau un problème que j'avais déjà rencontré mais qui semble ne pas se résoudre de la même façon : quand j'essaie de fermer la fenêtre et que l'écran victoire est affiché, la fenêtre ne se ferme pas mais l'écran victoire s'affiche de nouveau...
0
quent217 Messages postés 421 Date d'inscription vendredi 25 septembre 2015 Statut Membre Dernière intervention 1 mars 2024 344 > PY2019 Messages postés 17 Date d'inscription mercredi 24 avril 2019 Statut Membre Dernière intervention 29 avril 2019
29 avril 2019 à 00:37
Justement il ne faut pas remettre le compteur à 0. Mais si vous avez trouver une solution, tant mieux.
Pour que la fenêtre se ferme correctement, je pense que vous pouvez résoudre le problème de la même façon en ajoutant une instruction return après l'appel de la fonction
victoire()
.
0
PY2019 Messages postés 17 Date d'inscription mercredi 24 avril 2019 Statut Membre Dernière intervention 29 avril 2019
29 avril 2019 à 14:00
Merci beaucoup, ça fonctionne
0