Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
3139 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  Besoin d'aide : Pygame

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Besoin d'aide : Pygame

n°2281196
shingleton
Posté le 11-05-2016 à 15:33:38  profilanswer
 

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.\"
mood
Publicité
Posté le 11-05-2016 à 15:33:38  profilanswer
 

n°2281241
bistouille
Posté le 11-05-2016 à 20:48:02  profilanswer
 

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.
n°2281249
bistouille
Posté le 11-05-2016 à 21:42:20  profilanswer
 

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.
n°2281259
shingleton
Posté le 11-05-2016 à 23:44:30  profilanswer
 

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 ?

n°2281273
bistouille
Posté le 12-05-2016 à 10:54:47  profilanswer
 

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.
n°2281334
shingleton
Posté le 12-05-2016 à 16:17:18  profilanswer
 

Dac, merci :ange:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  Besoin d'aide : Pygame

 

Sujets relatifs
Aide Tkinter PythonPython : besoin de conseil pour un projet
Aide algo convertisseur hex/bin/dec (pseudo-code)AIDE programme python DEBUTANT
Demande d'aide pour instaler l'environement d'un FPGAbesoin de gagner du temps sur le cacul de recherche dans gros fichier
Aide pour exercice cAide sur un code Python
Aide SQL très simple[PHP] Besoin d'aide pour résoudre un message d'erreur
Plus de sujets relatifs à : Besoin d'aide : Pygame


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR