# coding: latin-1 import pygame import time def attendre_touche () : """cette fonction retourne différente valeur selon la touche pressée : - right : pour la flèche droite - gauche : pour la flèche gauche - up : pour la flèche haut - down : pour la flèche bas - quit : pour la touche ESC ou ECHAP - '' : chaîne vide pour aucune touche pressée """ for event in pygame.event.get(): if event.type == pygame.MOUSEBUTTONUP : return "clic" elif event.type == pygame.KEYDOWN : if event.key == 275 : return "right" elif event.key == 276 : return "left" elif event.key == 273 : return "up" elif event.key == 274 : return "down" elif event.key == 27 : return "quit" else : pass #print "key ", event.key else : #print event pass return "" class ImagePosition : """chaque image présente sur le disque dur doit être chargée en mémoire (self.image), cette image est affichée à l'écran (self.screen), à une position donnée (self.pos), si cette image est en fait un motif sur fond blanc, on peut préciser à l'ordinateur que ce fond blanc doit laisser apparaître le fond de l'écran """ def __init__ (self, image, pos, screen, transparent = False) : """initialisation - image : nom d'image - pos : position ou afficher l'image - screen : variable modélisant l'écran - transparent : l'image est-elle un motif dont le fond blanc doit être transparent ? """ self.image = pygame.image.load (image) self.x = pos [0] self.y = pos [1] self.screen = screen if transparent : # on précise ici que la couleur blanche (255,255,255) # doit être transparent self.image.set_colorkey ((255,255,255)) def display (self, transparent = False) : """affiche l'image à une position donnée sur l'écran""" screen.blit (self.image, (self.x, self.y)) def affiche (images) : """affiche une liste d'image dans l'ordre dans lequel elles apparaissent dans la liste""" white = (255,255,255) images [0].screen.fill (white) # met tout en blanc avant de dessiner les images for i in images : i.display () def deplacer_avion (images, avion, explosion, sounds, limitx) : """jeu, sans pression d'aucun touche, l'avion se déplace vers les deux girafes et fait tout exploser, on peut ralentir l'approche de l'avion en : - pressant les touches de directions - en frappant sans s'arrêter et alternativement les touches gauche droite """ pair = 0 # pair : il faut presser la flèche gauche, impair, flèche droite tour = 0 # compte le nombre de tour d'attente, sert à réduire # l'impact des touches pressées par le joueur # séquence de trois instructions affichant le jeu affiche (images) # on affiche le ciel et les girafes avion.display () # on affiche l'avion pygame.display.flip () # on rafraîchit l'écran # on regarde si une touche a été pressée t = attendre_touche () # pour afficher le score font = pygame.font.Font ("freesansbold.ttf", 15) # le jeu s'arrête lorsqu'on presse la touche ECHAP ou si l'avion # touche les girafes while t != "quit" and avion.x < limitx : # on compte le nombre de tours tour += 1 # en fonction de ce nombre de tour, on détermine l'impact d'une # séquence gauche droite dx = max ((400 - tour) / 100, 1) # si une touche a été pressée, alors : if t == "left" : # flèche gauche avion.x -= 1 if pair % 2 == 0 : avion.x -= dx pair += 1 elif t == "right" : # flèche droite avion.x += 1 if pair % 2 == 1 : avion.x -= dx pair += 1 elif t == "up" : # flèche haut avion.y -= 1 elif t == "down" : # flèche bas avion.y += 1 # quelque soit la touche pressée, on actualise le jeu # c'est la même séquence de trois touches qu'au début de la fonction affiche (images) avion.display () # on affiche le score également à l'écran text = font.render ("score " + str (avion.y), True,(255,255,255)) screen.blit(text, (100,100)) pygame.display.flip () # le programme attend 50 millisecondes avant de continuer time.sleep (0.05) # on déplace l'avion de force avion.x += 2 avion.y += 1 # on regarde si une touche a été pressée t = attendre_touche () # on est sorti de la boucle : c'est l'explosion # on affiche l'image et on rafraîchit l'écran explosion.display () pygame.display.flip () # on joue quelques sons for i in range (0, len (sounds)) : sounds [i].play () time.sleep (1.0*i) # on attend un peu avant de passer au son suivant # il est possible de ne pas attendre et de tous les # lancer en même temps # on rejoue les sons d'explosion 2 fois séparées de 2 secondes for i in range (0, 2) : sounds [0].play () sounds [1].play () time.sleep (2.0) # on affiche le score : plus l'avion descend, meilleur on est print "score ", avion.y # on affiche le score également à l'écran text = font.render ("score " + str (avion.y), True,(255,255,255)) screen.blit(text, (100,100)) pygame.display.flip () # on attend la pression de la touche ECHAP avant de quitter le programme while t != "quit" : t = attendre_touche () if __name__ == "__main__" : # initialisation du module pygame pygame.init () # on récupère la taille de l'image de la girafe sizeim = pygame.image.load("girafe.jpg").get_size () # on définit la taille de l'écran comme 3 fois plus large que celle de la girafe size = ( sizeim [0] * 3, sizeim [1]) screen = pygame.display.set_mode (size) # on définit l'image de l'avion avion = ImagePosition ("avion.PNG", (0,0), screen, True) # on définit l'image de l'explosion explosion = ImagePosition ("explosion.jpg", (0,0), screen) # on estime la limite au delà de laquelle l'avion explose limitx = size [0] - sizeim [0] + sizeim [0] / 3 - avion.image.get_size () [0] # on définit les sons qui doivent être joués à la fin du jeu soundname = ["bomb.wav", "explosion.wav", "explosion2.wav", "missile.wav", "sheep.wav"] sounds = [] for s in soundname : try : # exception au cas où le son ne pourrait pas être lu sounds.append ( pygame.mixer.Sound (s) ) except Exception, e : print "impossible de charger ", s print e # on construit la liste des images qui doivent être affichées à chaque fois images = [] images.append ( ImagePosition ("ciel.jpg", (0,0), screen) ) images.append ( ImagePosition ("girafe.jpg", (size [0] - sizeim [0], 0), screen) ) # on joue deplacer_avion (images, avion, explosion, sounds, limitx)