Problème de Compteur et de boucle...
Résolu
PY2019
Messages postés
17
Statut
Membre
-
PY2019 Messages postés 17 Statut Membre -
PY2019 Messages postés 17 Statut Membre -
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
- Mon pc s'allume et s'éteint en boucle ✓ - Forum Matériel & Système
- Mise à disposition de boucle locale dédiée ✓ - Forum Freebox
- Compteur point fléchette excel - Télécharger - Sport
#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...
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 .