Besoin d'aide : Pygame

Besoin d'aide : Pygame - Python - Programmation

Marsh Posté le 11-05-2016 à 15:33:38    

Salutations
 
Je suis en train de m'exercer au Pygame mais je rencontre un léger problème.
Je code un jeu ou il faut intercepter des tirs avec un drone, mais le problème c'est que lorsque le drone intercepte un tir, le jeu se ferme. J'ai localisé le problème, mais je ne vois pas comment le résoudre.
Ensuite, j'aimerai faire en sorte que le vaisseau tire à une certaine cadance, et de créer un timer pour faire en sorte que le jeu finisse au bout de trois minutes (sorte de "vous avez gagné" ).
 

Code :
  1. import pygame
  2. import winsound
  3. from pygame.locals import *
  4. import random
  5. from math import *
  6. continuer=1
  7. pygame.init()
  8. class laser():
  9.     def __init__(self,pos):
  10.         self.pos=pos
  11.         self.imglaser=pygame.image.load("laser.jpg" ).convert()
  12.         self.position_laser=self.imglaser.get_rect()
  13.         self.position_laser=self.position_laser.move(pos,0)
  14.         self.hauteur=0
  15.     def update_laser(self):
  16.         self.hauteur+=0.5
  17.         self.position_laser[1]=self.hauteur
  18.         fenetre.blit(self.imglaser,self.position_laser)
  19.     def touche_drone(self,position_drone):
  20.         return hypot(self.position_laser[0]-(position_drone[0]+50),self.position_laser[1]-(position_drone[1]+25))<50
  21. fenetre=pygame.display.set_mode((650,800))
  22. pygame.display.set_caption("Protegez la Ville : Utilisez les fleches pour diriger le drone." )
  23. ville=pygame.image.load("ville.jpg" ).convert()
  24. drone=pygame.image.load("drone.jpg" ).convert()
  25. position_drone=drone.get_rect()
  26. position_drone=position_drone.move(275,650)
  27. fenetre.blit(ville,(0,0))
  28. las=laser(random.randint(0,650))
  29. pygame.display.flip()
  30. while continuer:
  31.     key=pygame.key.get_pressed()
  32.     if key[K_RIGHT]:
  33.         if position_drone[0]<550:position_drone=position_drone.move(1,0)
  34.     if key[K_LEFT]:
  35.         if position_drone[0]>0:position_drone= position_drone.move(-1,0)
  36.     if las.touche_drone(position_drone):
  37.         continuer=0
  38.     fenetre.blit(ville,(0,0))
  39.     fenetre.blit(drone,position_drone)
  40.     for event in pygame.event.get():
  41.         if event.type==QUIT:
  42.             continuer=0
  43.     las.update_laser()
  44.     pygame.display.update()
  45. pygame.quit()


 
Voici les images :
 
drone.jpg : http://image.noelshack.com/fichier [...] -drone.jpg
laser.jpg : http://image.noelshack.com/fichier [...] -laser.jpg
ville.jpg : http://image.noelshack.com/fichier [...] -ville.jpg
 
Merci d'avence.


---------------
\"Celui qui doit combattre des monstres doit prendre garde de ne pas devenir monstre lui-même.\"
Reply

Marsh Posté le 11-05-2016 à 15:33:38   

Reply

Marsh Posté le 11-05-2016 à 20:48:02    

Ligne 45
 

Code :
  1. if las.touche_drone(position_drone):
  2.         continuer=0


 
Là si tu interceptes le tir, tu stoppes la boucle, c'est pour ça que ta fenêtre se ferme.
Donc, c'est pas ça qu'il faut faire, faut seulement que tu redéfinisses un laser, pour continuer le jeu.
 

Code :
  1. if las.touche_drone(position_drone):
  2.     las=laser(random.randint(0,650))


 
Le problème c'est que pour sortir de ta boucle en cas d'échec d'interception, faut que tu saches si le tir a fini sa course vers le bas.
Voir donc pour calculer ses coordonnées, et s'il  atteint le bas de la fenêtre, paf, sortie de boucle.
 
Je connais pas pygame, mais y'a forcément des fonctions pour connaître la position d'un objet sur la fenêtre.


---------------
On croit souvent avoir vu le fond de la stupidité humaine, et il parfois nécessaire qu'on vous rappelle qu'elle n'a pas de fond.
Reply

Marsh Posté le 11-05-2016 à 21:42:20    

J'ai jeté un oeil plus attentivement à ton code, ben en fait pas b'soin de fonctions spécifiques.
 
Le code qui répond à tout ce que tu voulais :o
 

Code :
  1. #!/usr/bin/python2.7
  2. # -*-coding: utf-8 -*
  3. import pygame
  4. try :
  5.     import winsound # Truc spécifique à windows :o
  6. except :
  7.     pass
  8. from pygame.locals import *
  9. import random
  10. from math import *
  11. from time import time
  12. pygame.init()
  13. class Vitesse :
  14.     def __init__(self) :
  15.         self._valeur = 0.5
  16.    
  17.     def increment(self) :
  18.         self._valeur += 0.005
  19.        
  20.     def valeur(self) :
  21.         return self._valeur
  22.        
  23. vitesse = Vitesse()
  24.        
  25. class laser():
  26.     def __init__(self,pos):
  27.         self.pos=pos
  28.         self.imglaser=pygame.image.load("laser.jpg" ).convert()
  29.         self.position_laser=self.imglaser.get_rect()
  30.         self.position_laser=self.position_laser.move(pos,0)
  31.         self.hauteur=0
  32.     def update_laser(self):
  33.         self.hauteur+=vitesse.valeur()
  34.         self.position_laser[1]=self.hauteur
  35.         fenetre.blit(self.imglaser,self.position_laser)
  36.     def touche_drone(self,position_drone):
  37.         return hypot(self.position_laser[0]-(position_drone[0]+50),self.position_laser[1]-(position_drone[1]+25))<50
  38.        
  39.     def getHauteur(self) :
  40.         return self.hauteur
  41. fenetre=pygame.display.set_mode((650,800))
  42. pygame.display.set_caption("Protegez la Ville : Utilisez les fleches pour diriger le drone." )
  43. ville=pygame.image.load("ville.jpg" ).convert()
  44. drone=pygame.image.load("drone.jpg" ).convert()
  45. position_drone=drone.get_rect()
  46. position_drone=position_drone.move(275,650)
  47. fenetre.blit(ville,(0,0))
  48. pygame.display.flip()
  49. las=laser(random.randint(0,650))
  50. tempsDebut = time()
  51. tempsJeuMax = 180 # 3 minutes
  52. score = 0
  53. while True:
  54.     key=pygame.key.get_pressed()
  55.     if key[K_RIGHT]:
  56.         if position_drone[0]<550:position_drone=position_drone.move(1,0)
  57.     if key[K_LEFT]:
  58.         if position_drone[0]>0:position_drone= position_drone.move(-1,0)
  59.     if las.touche_drone(position_drone):
  60.         score += 1
  61.         vitesse.increment()
  62.         las=laser(random.randint(0,650))
  63.    
  64.     if time() - tempsDebut > tempsJeuMax :
  65.         print 'Temps de jeu imparti terminé'
  66.         break
  67.     if las.getHauteur() > 800 :
  68.         print 'Perdu !'
  69.         break
  70.        
  71.     fenetre.blit(ville,(0,0))
  72.     fenetre.blit(drone,position_drone)
  73.     for event in pygame.event.get():
  74.         if event.type==QUIT:
  75.             continuer=0
  76.     las.update_laser()
  77.     pygame.display.update()
  78.    
  79. print 'Vous avez intercepté %s tir(s)' % score
  80. pygame.quit()


 
Voilà.
 


---------------
On croit souvent avoir vu le fond de la stupidité humaine, et il parfois nécessaire qu'on vous rappelle qu'elle n'a pas de fond.
Reply

Marsh Posté le 11-05-2016 à 23:44:30    

Merci beaucoup :ange:  
 
J'ai encore une derniere petite question : j'aimerai faire en sorte que lorsque

Code :
  1. if las.getHauteur() > 800 :


une image apparaisse (un Game Over) au milieu de l'écran, mais quand je met

Code :
  1. if las.getHauteur() > 800 :
  2.         fenetre.blit(gameover(0,400))


ça ne marche pas.
Une idée ?

Reply

Marsh Posté le 12-05-2016 à 10:54:47    

Si tu veux afficher  d'autres choses lorsque le jeu n'est pas en cours d'exécution (fenêtre de démarrage, options de jeu, etc...), il faut revoir la structure du while.
 
Exemple :
 

Code :
  1. jeuEnCours = True
  2. etatJeu = True
  3. while etatJeu :
  4.    
  5.     if jeuEnCours :
  6.         key=pygame.key.get_pressed()
  7.         if key[K_RIGHT]:
  8.             if position_drone[0]<550:position_drone=position_drone.move(1,0)
  9.         if key[K_LEFT]:
  10.             if position_drone[0]>0:position_drone= position_drone.move(-1,0)
  11.         if las.touche_drone(position_drone) :
  12.             score += 1
  13.             vitesse.increment()
  14.             las=laser(random.randint(0,650))
  15.        
  16.         if time() - tempsDebut > tempsJeuMax :
  17.             jeuEnCours = False
  18.         if las.getHauteur() > 800 :
  19.             jeuEnCours = False
  20.            
  21.         fenetre.blit(ville,(0,0))
  22.         fenetre.blit(drone,position_drone)
  23.        
  24.         las.update_laser()
  25.     else :
  26.         # C'est ici que tu afficheras tout ce qui ne concerne pas le déroulement du jeu
  27.         # Jeu Terminé
  28.         # Détruire tous les éléments créés dans la fenêtre, à toi de regarder dans la doc pygame
  29.         fenetre.blit(gameover,(0,400))
  30.     for event in pygame.event.get():
  31.         if event.type in (QUIT, 12) # Je connais pas le nom de la constante du destroy fenêtre (qui vaut 12) à toi de changer
  32.             etatJeu = False
  33.     pygame.display.update()


 
Plus tu vas ajouter des fonctionnalités à ton jeu, plus ta boucle while se complexifiera, il faudra alors dispatcher tout ça dans des fonctions/méthodes de classes
 
Bon courage.


Message édité par bistouille le 12-05-2016 à 10:56:26

---------------
On croit souvent avoir vu le fond de la stupidité humaine, et il parfois nécessaire qu'on vous rappelle qu'elle n'a pas de fond.
Reply

Marsh Posté le 12-05-2016 à 16:17:18    

Dac, merci :ange:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed