PY2019 Messages postés17Date d'inscriptionStatutMembreDernière intervention - PY2019 Messages postés17Date d'inscriptionStatutMembreDernière intervention - 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 e la ligne).
Voici mon programme principal (avec la ligne d'arrivée qui e 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 :))
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.
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...
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
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 .