Problème de Compteur et de boucle...
Résolu
PY2019
Messages postés
17
Date d'inscription
Statut
Membre
Dernière intervention
-
PY2019 Messages postés 17 Date d'inscription Statut Membre Dernière intervention -
PY2019 Messages postés 17 Date d'inscription Statut Membre Dernière intervention -
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 :
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):
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 :))
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 :))
A voir également:
- Problème de Compteur et de boucle...
- Compteur électrique - Guide
- Compteur de contractions - Télécharger - Santé & Bien-être
- Comment ralentir un compteur linky forum - Accueil - Objets connectés
- Mise à disposition de boucle locale dédiée ✓ - Forum Freebox
- Mon pc s'allume et s'éteint en boucle ✓ - Forum Matériel & Système
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...
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 .