PY2019
Messages postés17Date d'inscriptionmercredi 24 avril 2019StatutMembreDernière intervention29 avril 2019
-
28 avril 2019 à 19:11
PY2019
Messages postés17Date d'inscriptionmercredi 24 avril 2019StatutMembreDernière intervention29 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 :))
quent217
Messages postés421Date d'inscriptionvendredi 25 septembre 2015StatutMembreDernière intervention 1 mars 2024346 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.
PY2019
Messages postés17Date d'inscriptionmercredi 24 avril 2019StatutMembreDernière intervention29 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...
PY2019
Messages postés17Date d'inscriptionmercredi 24 avril 2019StatutMembreDernière intervention29 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...
quent217
Messages postés421Date d'inscriptionvendredi 25 septembre 2015StatutMembreDernière intervention 1 mars 2024346
>
PY2019
Messages postés17Date d'inscriptionmercredi 24 avril 2019StatutMembreDernière intervention29 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()
.
PY2019
Messages postés17Date d'inscriptionmercredi 24 avril 2019StatutMembreDernière intervention29 avril 2019 29 avril 2019 à 14:00
28 avril 2019 à 23:34
28 avril 2019 à 23:55
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...
29 avril 2019 à 00:37
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 .
29 avril 2019 à 14:00