Exemples de codes Python utilisant pygame

Pygame est un environnement python qui permet de facilement créer des jeux, et plus généralement de l'animation graphique et de l'interaction clavier et/ou souris avec l'utilisatieur.

Le site de référence sur Pygame.
Un très bon cours d'introduction à Pygame, sur le site de OpenClassRooms.
Le wiki de base de Pygame. Bof ?
Un interpréteur Python en javascript. Il permet d'exécuter du pygame !
Module pour entrer du texte sous pygame. En anglais.
Modules pour entrer du texte sous pygame. En français.
.

Installation de pygame sous Linux, Windows et Mac  
Un copier coller du code (sur fond blanc) dans l'IDLE, sauvé avec l'extension ".py" affichera le code en couleur.

Ce qui suit est essentiellement tiré du site de OpenClassRooms référencé en gras ci-dessus.
Les images suivantes seront utiles, vous pouvez les copier chez vous. (Clique droit > Enregistrer l'image sous...)
background_herbe.jpg   perso_1.png   boule bleue   boule bleue

En plus des images, les deux sons suivants sont nécessaires pour 'pyg0060_son_mixer.py' : chunk.ogg   et   cash.ogg

Lien sur un fichier donnant la liste des codes des touches. Cette liste vient de nouveau du site de OpenClassRooms référencé en début de page.
pygame_code_touches.txt

Table des matières

° pyg0010_bases.py
Un premier exemple.
Placement de deux images.
Déplacement d'une image à l'aide du clavier.
On quitte le programme avec la touche ESC.

° pyg0020_bases_mouvements.py
Mouvements continus avec le clavier.
Déplacement avec la souris.
Réaction au clique de la souris.

° pyg0027_bases_mouvements.py
Mouvements continus avec le clavier.
Déplacement avec la souris.
Réaction au clique de la souris.
Adjonction de projectiles tirés avec la touche espace. Utilisation de la programmation objet pour cela. Chaque projectile est un objet.
Voici une suite d'autres essais-exemples qui sont référencés ici :
pyg0021 méthode avec un tableau de 20 balles
pyg0022 méthode avec un tableau de 20 balles
pyg0023 méthode avec un tableau de 20 balles
pyg0024 méthode avec un tableau de 20 balles
pyg0025 méthode avec des objets et un timer
pyg0026 méthode avec des objets et un timer. Non optimal, déconseillé.
pyg0027 méthode avec une liste d'objets.
pyg0028, petites améliorations de ce qui précède.

° pyg0024b_bases_mouvements.py
Reprise de pyg0024_bases_mouvements.py, avec adjonction de la rotation d'une image.
La rotation dans pygame a le défaut de modifier la taille du rectangle contenant l'image.
La fonction "rot_center(image, angle)" a été écrite, pour que la rotation se fasse relativement au centre de l'image et pour que le rectangle contenant l'image reste le même.

° pyg0050_defilement_image.py. C'est le fond qui bouge au lieu de l'image.
° pyg0051_defilement_image.py. Version améliorée, avec des tirs de balles.
° pyg0060_son_mixer.py. Du son dans pygame.

° pyg0110a_ping_pong.py. Début d'un jeu de ping-pong dans pygame.

pyg0010_bases.py   TOP
Un premier exemple.
Placement de deux images.
Déplacement d'une image à l'aide du clavier.
On quitte le programme avec la touche ESC.
# pyg0010_bases.py
# Référence : https://openclassrooms.com/courses/interface-graphique-pygame-pour-python/premieres-fenetres
# Premier essais avec Pygame en Python 3
# Gestion d'événements :
# https://openclassrooms.com/courses/interface-graphique-pygame-pour-python/gestion-des-evenements-1
'''
Liste des modules de Pygame :
    display
    mixer   # pour la gestion du son
    draw
    event
    image
    mouse
    time
'''

import pygame
from pygame.locals import *

# Initialisation des modules de Pygame
pygame.init()

# Création d'une fenêtre graphique de Pygame
##fenetre = pygame.display.set_mode((640, 480))

# Permet de rendre la fenêtre de taille ajustable.
fenetre = pygame.display.set_mode((640,480), RESIZABLE)

# Une image pour le fond de la fenêtre
fond = pygame.image.load("images/background_herbe.jpg").convert()
perso1 = pygame.image.load("images/perso_1.png").convert_alpha()

# Ne fonctionne pas !???
perso1.set_colorkey((255,255,255)) #Rend le blanc (valeur RGB : 255,255,255) de l'image transparent


# Affiche l'image dans la fenêtre
fenetre.blit(fond, (0, 0))

# Affiche le personnage au-dessus de l'herbe
fenetre.blit(perso1, (200, 200))

# Actualise la fenêtre
pygame.display.flip()

nPosX = 200 # Position en X de la personne
nPosY = 200 # Position en Y de la personne

pygame.key.set_repeat(400, 30)

# Variable qui continue la boucle si = 1, stoppe si = 0
continuer = 1

# ================================================
# Boucle principale
while continuer:

    # Boucle sur tous les événements gérés par Pygame
    for event in pygame.event.get():        
        if event.type == QUIT or event.type == KEYDOWN and event.key == K_ESCAPE:
            # La fenêtre a été fermée ou La touche ESC a été pressée.
            continuer = 0 # Indique de sortir de la boucle.

        if event.type == KEYDOWN:  # KEYUP existe aussi
            if event.key == K_RIGHT: nPosX += 20
            if event.key == K_LEFT: nPosX -= 20
            if event.key == K_UP: nPosY -= 20
            if event.key == K_DOWN: nPosY += 20
            
            fenetre.blit(fond, (0, 0))
            fenetre.blit(perso1, (nPosX, nPosY))

            # Actualise la fenêtre
            pygame.display.flip()

pygame.display.quit() # ferme la fenêtre, c.f. https://www.pygame.org/docs/ref/display.html
pygame.quit() # quitte pygame, c.f. https://www.pygame.org/docs/ref/pygame.html

pyg0020_bases_mouvements.py   TOP
Mouvements continus avec le clavier.
Déplacement avec la souris.
Réaction au clique de la souris.
# pyg0020_bases_mouvements.py
# Référence : https://openclassrooms.com/courses/interface-graphique-pygame-pour-python/premieres-fenetres
# Premier essais avec Pygame en Python 3
# Gestion d'événements :
# https://openclassrooms.com/courses/interface-graphique-pygame-pour-python/gestion-des-evenements-1
# TP-DK Labyrinthe !
# https://openclassrooms.com/courses/interface-graphique-pygame-pour-python/tp-dk-labyrinthe
'''
Liste des modules de Pygame :
    display
    mixer   # pour la gestion du son
    draw
    event
    image
    mouse
    time
'''

import pygame
from pygame.locals import *
import os

# Pour positionner la fenêtre Pygame.
#os.environ['SDL_VIDEO_WINDOW_POS'] = '20,100'
os.environ['SDL_VIDEO_WINDOW_POS'] = '%d,%d' % (120, 200)

# Information sur le display
# https://www.pygame.org/docs/ref/display.html

# Initialisation des modules de Pygame
pygame.init()

# Création d'une fenêtre graphique de Pygame
##fenetre = pygame.display.set_mode((640, 480))

# Permet de rendre la fenêtre de taille ajustable.
fenetre = pygame.display.set_mode((640,480), RESIZABLE)

# Une image pour le fond de la fenêtre
fond = pygame.image.load("images/background_herbe.jpg").convert()
perso1 = pygame.image.load("images/perso_1.png").convert_alpha()

# Ne fonctionne pas !???
perso1.set_colorkey((255,255,255)) #Rend le blanc (valeur RGB : 255,255,255) de l'image transparent


# Affiche l'image dans la fenêtre
fenetre.blit(fond, (0, 0))

# Affiche le personnage au-dessus de l'herbe
fenetre.blit(perso1, (200, 200))

# Actualise la fenêtre
pygame.display.flip()

nPosX = 200 # Position en X de la personne
nPosY = 200 # Position en Y de la personne

# Pour avoir un autorepeat si une touche est pressée.
pygame.key.set_repeat(10, 3) # répétition de la touche toutes les ... [ms]

# Variable qui continue la boucle si = 1, stoppe si = 0
continuer = 1

# ================================================
# Boucle principale
while continuer:

    # Boucle sur tous les événements gérés par Pygame
    for event in pygame.event.get():        
        if event.type == QUIT or event.type == KEYDOWN and event.key == K_ESCAPE:
            # La fenêtre a été fermée ou La touche ESC a été pressée.
            continuer = 0 # Indique de sortir de la boucle.

        if event.type == KEYDOWN:  # KEYUP existe aussi
            # Change les coordonnées de la position de la personne
            if event.key == K_RIGHT: nPosX += 1
            if event.key == K_LEFT: nPosX -= 1
            if event.key == K_UP: nPosY -= 1
            if event.key == K_DOWN: nPosY += 1

            # Affiche le fond, puis la personne par-dessus
            fenetre.blit(fond, (0, 0))
            fenetre.blit(perso1, (nPosX, nPosY))

            # Actualise la fenêtre
            pygame.display.flip()

        if event.type == MOUSEBUTTONDOWN: # Un bouton de la souris pressé
            if event.button == 1: # Boutton gauche pressé
                # Change les coordonnées de la position de la personne
                nPosX = event.pos[0]  # Coordonnées du pointeur de souris
                nPosY = event.pos[1] 
            
            if event.button == 3: # Boutton droit pressé
                # Change les coordonnées de la position de la personne
                nPosX = event.pos[0] - perso1.get_width() 
                nPosY = event.pos[1] - perso1.get_height()
            
            # Affiche le fond, puis la personne par-dessus
            fenetre.blit(fond, (0, 0))
            fenetre.blit(perso1, (nPosX, nPosY))

            # Actualise la fenêtre
            pygame.display.flip()


        if event.type == MOUSEMOTION: # La souris a bougé
            if event.buttons[0] == 1: # Boutton gauche pressé
                # Change les coordonnées de la position de la personne
                nPosX = event.pos[0]  # Coordonnées du pointeur de souris
                nPosY = event.pos[1] 
            
            ##if event.buttons[1] == 1: # Boutton du milieu pressé
            if event.buttons[2] == 1: # Boutton du milieu pressé
                # Change les coordonnées de la position de la personne
                nPosX = event.pos[0] - perso1.get_width() 
                nPosY = event.pos[1] - perso1.get_height()
            
            # Affiche le fond, puis la personne par-dessus
            fenetre.blit(fond, (0, 0))
            fenetre.blit(perso1, (nPosX, nPosY))

            # Actualise la fenêtre
            pygame.display.flip()


pygame.display.quit() # ferme la fenêtre, c.f. https://www.pygame.org/docs/ref/display.html
pygame.quit() # quitte pygame, c.f. https://www.pygame.org/docs/ref/pygame.html

pyg0027_bases_mouvements.py   TOP
Mouvements continus avec le clavier.
Déplacement avec la souris.
Réaction au clique de la souris.
Adjonction de projectiles tirés avec la touche espace. Utilisation de la programmation objet pour cela. Chaque projectile est un objet.
# pyg0027_bases_mouvements.py
# Référence : https://openclassrooms.com/courses/interface-graphique-pygame-pour-python/premieres-fenetres
# Premier essais avec Pygame en Python 3
# Gestion d'événements :
# https://openclassrooms.com/courses/interface-graphique-pygame-pour-python/gestion-des-evenements-1
# TP-DK Labyrinthe !
# https://openclassrooms.com/courses/interface-graphique-pygame-pour-python/tp-dk-labyrinthe
#
# Lancement de projectiles.
# Dans pyg0022_bases_mouvements.py, il est presque impossible de lancer un seul projectle à la fois.
# Ici, on gère cela en testant que la touche espace K_SPACE a été relachée avant de relancer un projectil.
# Dans pyg0023_bases_mouvements.py, lorsque l'on presse sur la touche espace, le personnage s'arrête.
# Ici, il s'arrête si on arrête de presser sur les flèches.
# Dans pyg0024_bases_mouvements.py, l'ensemble des projectiles est géré par un tableau.
# Dans pyg0025.py, un projectile est un objet. Une fois créé, le reste du programme l'ignore,
# c'est l'objet lui-même qui gère son déplacement et sa destruction finale.
# Cela pause des problèmes d'affichage, ainsi que de gestion en fin de partie.
# Les problèmes de gestion de fin de partie peuvent se régler à l'aide d'un compteur.
# Les objets sont référencés dans une liste.

'''
Liste des modules de Pygame :
    display
    mixer   # pour la gestion du son
    draw
    event
    image
    mouse
    time
'''

import pygame
from pygame.locals import *
import os

# ===== Variables globales ======================

# Variable qui continue la boucle si = 1, stoppe si = 0
continuer = 1

nPosX = 200 # Position en X du personnage
nPosY = 200 # Position en Y du personnage
nDirX = 0   # Sens de déplacement du personnage selon X. 0 => il ne bougle pas
nDirY = 0   # Sens de déplacement du personnage selon Y. 0 => il ne bougle pas

fLanceOK = True # Indique que l'on peut lancer un projectile
glaProjectiles = [] # Le tableau des projectiles
glnCount = 0 # Juste pour compter le nombre de projectiles créés.

class Projectile:
#################
    '''Classe des projectiles, pour les rendre autonomes'''
    def __init__(self, nPosX, nPosY):
    #""""""""""""""""""""""""""""""""
        global glnCount
        glnCount += 1
        self.nCount = glnCount # Indique le numéro du projectile
        self.nProjPosX = nPosX 
        self.nProjPosY = nPosY

    def mouvement(self):
    #"""""""""""""""""""
        # Monte le projectile de .. pixels
        self.nProjPosY -= 1.8
        fenetre.blit(projectile, (self.nProjPosX, self.nProjPosY))

        # Si le projectile a atteint le haut de l'écarn, il est détruit
        if (self.nProjPosY < -20):
            # Destruction de l'objet projectile
            print('Fin de', self.nCount)
            glaProjectiles.remove(self)

# Pour positionner la fenêtre Pygame.
#os.environ['SDL_VIDEO_WINDOW_POS'] = '20,100'
os.environ['SDL_VIDEO_WINDOW_POS'] = '%d,%d' % (120, 200)

# Information sur le display
# https://www.pygame.org/docs/ref/display.html

# Initialisation des modules de Pygame
pygame.init()

# Création d'une fenêtre graphique de Pygame
##fenetre = pygame.display.set_mode((640, 480))

# Permet de rendre la fenêtre de taille ajustable.
fenetre = pygame.display.set_mode((640,480), RESIZABLE)

# Une image pour le fond de la fenêtre
fond = pygame.image.load("images/background_herbe.jpg").convert()
perso1 = pygame.image.load("images/perso_1.png").convert_alpha()
projectile = pygame.image.load("images/BouleBleue.png").convert_alpha()

# Ne fonctionne pas !???
perso1.set_colorkey((255,255,255)) #Rend le blanc (valeur RGB : 255,255,255) de l'image transparent

# Affiche l'image dans la fenêtre
fenetre.blit(fond, (0, 0))

# Affiche le personnage au-dessus de l'herbe
fenetre.blit(perso1, (200, 200))

# Actualise la fenêtre
pygame.display.flip()

# Pour avoir un autorepeat si une touche est pressée.
pygame.key.set_repeat(10, 3) # répétition de la touche toutes les ... [ms]

# Pour définir une vitesse d'exécution,
# en limitant en attendant qu'un certain temps se soit écoulé avant de continuer.
myClock = pygame.time.Clock()

# ================================================
# Boucle principale
while continuer:

    # Boucle sur tous les événements gérés par Pygame
    for event in pygame.event.get():        
        if event.type == QUIT or event.type == KEYDOWN and event.key == K_ESCAPE:
            # La fenêtre a été fermée ou La touche ESC a été pressée.
            continuer = 0 # Indique de sortir de la boucle.

        if event.type == KEYDOWN:  # KEYUP existe aussi
            # Change les coordonnées de la position de la personne
            if event.key == K_RIGHT: nDirX =  4
            if event.key == K_LEFT: nDirX  = -4
            if event.key == K_UP: nDirY    = -4
            if event.key == K_DOWN: nDirY  =  4
            if (event.key == K_SPACE) and fLanceOK:
                fLanceOK = False # pour ne pas permettre de lancer plusieurs projecties en même temps
                # Adjonction d'un projectile à la liste des projectiles
                glaProjectiles.append(Projectile(nPosX + 20, nPosY))

        if event.type == KEYUP: # pour ne pas permettre de lancer plusieurs projectiles en même temps
            if event.key == K_RIGHT: nDirX = 0
            if event.key == K_LEFT: nDirX  = 0
            if event.key == K_UP: nDirY    = 0
            if event.key == K_DOWN: nDirY  = 0
            if (event.key == K_SPACE): fLanceOK = True

        if event.type == MOUSEBUTTONDOWN: # Un bouton de la souris pressé
            if event.button == 1: # Boutton gauche pressé
                # Change les coordonnées de la position de la personne
                nPosX = event.pos[0]  # Coordonnées du pointeur de souris
                nPosY = event.pos[1]
                pixColor = fenetre.get_at((nPosX, nPosY)) # détection de la couleur à l'endroit indiqué
                print("Couleur =", pixColor)   # c.f. http://www.pygame.org/docs/ref/surface.html#Surface.get_at
            
            if event.button == 3: # Boutton droit pressé
                # Change les coordonnées de la position de la personne
                nPosX = event.pos[0] - perso1.get_width() 
                nPosY = event.pos[1] - perso1.get_height()

            # Actualise la fenêtre
            pygame.display.flip()

        if event.type == MOUSEMOTION: # La souris a bougé
            if event.buttons[0] == 1: # Boutton gauche pressé
                # Change les coordonnées de la position de la personne
                nPosX = event.pos[0]  # Coordonnées du pointeur de souris
                nPosY = event.pos[1] 
            
            ##if event.buttons[1] == 1: # Boutton du milieu pressé
            if event.buttons[2] == 1: # Boutton du milieu pressé
                # Change les coordonnées de la position de la personne
                nPosX = event.pos[0] - perso1.get_width() 
                nPosY = event.pos[1] - perso1.get_height()
            
            # Actualise la fenêtre
            pygame.display.flip()

    # Déplacement du personnage
    nPosX += nDirX
    nPosY += nDirY
    
    # Affiche le fond
    fenetre.blit(fond, (0, 0)) # pour laisser les autres objets se dessiner par dessus le fond
    
    # Affiche la personne (par dessus le fond)
    fenetre.blit(perso1, (nPosX, nPosY))

    # Déplacement de tous les projectiles
    # Affiche les projectiles par dessus ce qui prédèce
    # Il faut parcourir la liste depuis la fin, car len(glaProjectiles) peut changer dans la boucle.
    i = len(glaProjectiles)
    while i > 0:
        i -= 1
        glaProjectiles[i].mouvement()
        
    # Actualise la fenêtre
    pygame.display.flip()

    # Limitation de la vitesse à ... images par seconde
    # 100 => attend que 1000 / 100 [ms] se soit écoulé depuis le dernier appel,
    # avant de continuer.
    # 100 => limite à 100 images par secondes, soit 100 exécutions de la boucle par seconde
    myClock.tick(100) # c.f. https://www.pygame.org/docs/ref/time.html#pygame.time.Clock.tick
  
pygame.display.quit() # ferme la fenêtre, c.f. https://www.pygame.org/docs/ref/display.html
pygame.quit() # quitte pygame, c.f. https://www.pygame.org/docs/ref/pygame.html

pyg0024b_bases_mouvements.py   TOP
Reprise de pyg0024_bases_mouvements.py, avec adjonction de la rotation d'une image.
La rotation dans pygame a le défaut de modifier la taille du rectangle contenant l'image.
La fonction "rot_center(image, angle)" a été écrite, pour que la rotation se fasse relativement au centre de l'image et pour que le rectangle contenant l'image reste le même.
# pyg0024b_bases_mouvements.py
# Référence : https://openclassrooms.com/courses/interface-graphique-pygame-pour-python/premieres-fenetres
# Premier essais avec Pygame en Python 3
# Gestion d'événements :
# https://openclassrooms.com/courses/interface-graphique-pygame-pour-python/gestion-des-evenements-1
# TP-DK Labyrinthe !
# https://openclassrooms.com/courses/interface-graphique-pygame-pour-python/tp-dk-labyrinthe
#
# Lancement de projectiles.
# Dans pyg0022_bases_mouvements.py, il est presque impossible de lancer un seul projectle à la fois.
# Ici, on gère cela en testant que la touche espace K_SPACE a été relachée avant de relancer un projectil.
# Dans pyg0023_bases_mouvements.py, lorsque l'on presse sur la touche espace, le personnage s'arrête.
# Ici, il s'arrête si on arrête de presser sur les flèches.
#
# Développement à partir de pyg0024, en ajoutant des ROTATIONs d'IMAGES.
'''
Liste des modules de Pygame :
    display
    mixer   # pour la gestion du son
    draw
    event
    image
    mouse
    time
'''

import pygame
from pygame.locals import *
import os
#from threading import Timer # pour lancer un Timer

# ===== Variables globales ======================

# Variable qui continue la boucle si = 1, stoppe si = 0
continuer = 1

nPosX = 200 # Position en X du personnage
nPosY = 200 # Position en Y du personnage
nDirX = 0   # Sens de déplacement du personnage selon X. 0 => il ne bougle pas
nDirY = 0   # Sens de déplacement du personnage selon Y. 0 => il ne bougle pas

# Tableau de 20 projectiles
nbProj = 20 # Nombre max de projectiles
anProjPosX = 20*[200] # positions des projectiles
anProjPosY = 20*[400]
afProjVisible = 20*[False]
fLanceOK = True # Indique que l'on peut lancer un projectile

def rot_center(image, angle):
    """rotate an image while keeping its center and size"""
    rot_rect = image.get_rect().copy()                # Copie du rectange d'origine de l'image
    rot_image = pygame.transform.rotate(image, angle) # Rotation de l'image
    rot_rect.center = rot_image.get_rect().center     # défini le centre du rectangle
    rot_image = rot_image.subsurface(rot_rect).copy() # limite l'image tournée au rectangle d'origine
    return rot_image


# Pour positionner la fenêtre Pygame.
#os.environ['SDL_VIDEO_WINDOW_POS'] = '20,100'
os.environ['SDL_VIDEO_WINDOW_POS'] = '%d,%d' % (120, 200)

# Information sur le display
# https://www.pygame.org/docs/ref/display.html

# Initialisation des modules de Pygame
pygame.init()

# Création d'une fenêtre graphique de Pygame
##fenetre = pygame.display.set_mode((640, 480))

# Permet de rendre la fenêtre de taille ajustable.
fenetre = pygame.display.set_mode((640,480), RESIZABLE)

# Une image pour le fond de la fenêtre
fond = pygame.image.load("images/background_herbe.jpg").convert()
perso1 = pygame.image.load("images/perso_1.png").convert_alpha()
projectile = pygame.image.load("images/BouleBleue_dir.png").convert_alpha()

# Ne fonctionne pas !???
perso1.set_colorkey((255,255,255)) #Rend le blanc (valeur RGB : 255,255,255) de l'image transparent

# Rotation de l'image
#projectile = pygame.transform.rotate(projectile, 50)

# Affiche l'image dans la fenêtre
fenetre.blit(fond, (0, 0))

# Affiche le personnage au-dessus de l'herbe
fenetre.blit(perso1, (200, 200))

# Actualise la fenêtre
pygame.display.flip()

# Pour avoir un autorepeat si une touche est pressée.
pygame.key.set_repeat(10, 3) # répétition de la touche toutes les ... [ms]

# Pour définir une vitesse d'exécution,
# en limitant en attendant qu'un certain temps se soit écoulé avant de continuer.
myClock = pygame.time.Clock()

# ================================================
# Boucle principale
while continuer:

    # Boucle sur tous les événements gérés par Pygame
    for event in pygame.event.get():        
        if event.type == QUIT or event.type == KEYDOWN and event.key == K_ESCAPE:
            # La fenêtre a été fermée ou La touche ESC a été pressée.
            continuer = 0 # Indique de sortir de la boucle.

        if event.type == KEYDOWN:  # KEYUP existe aussi
            # Change les coordonnées de la position de la personne
            if event.key == K_RIGHT: nDirX =  1
            if event.key == K_LEFT: nDirX  = -1
            if event.key == K_UP: nDirY    = -1
            if event.key == K_DOWN: nDirY  =  1
            if (event.key == K_SPACE) and fLanceOK:
                fLanceOK = False # pour ne pas permettre de lancer plusieurs projecties en même temps
                
                # Cherche un projectile libre dans la liste, pour le rendre visible
                for nn in range(nbProj):
                    if (not afProjVisible[nn]):
                        # Un projectile libre disponible, lance-le
                        afProjVisible[nn] = True
                        anProjPosX[nn] = nPosX + 20
                        anProjPosY[nn] = nPosY
                        break # sort de la boucle

        if event.type == KEYUP: # pour ne pas permettre de lancer plusieurs projectiles en même temps
            if event.key == K_RIGHT: nDirX = 0
            if event.key == K_LEFT: nDirX  = 0
            if event.key == K_UP: nDirY    = 0
            if event.key == K_DOWN: nDirY  = 0
            if (event.key == K_SPACE):
                fLanceOK = True

        if event.type == MOUSEBUTTONDOWN: # Un bouton de la souris pressé
            if event.button == 1: # Boutton gauche pressé
                # Change les coordonnées de la position de la personne
                nPosX = event.pos[0]  # Coordonnées du pointeur de souris
                nPosY = event.pos[1] 
            
            if event.button == 3: # Boutton droit pressé
                # Change les coordonnées de la position de la personne
                nPosX = event.pos[0] - perso1.get_width() 
                nPosY = event.pos[1] - perso1.get_height()

            # Actualise la fenêtre
            pygame.display.flip()


        if event.type == MOUSEMOTION: # La souris a bougé
            if event.buttons[0] == 1: # Boutton gauche pressé
                # Change les coordonnées de la position de la personne
                nPosX = event.pos[0]  # Coordonnées du pointeur de souris
                nPosY = event.pos[1] 
            
            ##if event.buttons[1] == 1: # Boutton du milieu pressé
            if event.buttons[2] == 1: # Boutton du milieu pressé
                # Change les coordonnées de la position de la personne
                nPosX = event.pos[0] - perso1.get_width() 
                nPosY = event.pos[1] - perso1.get_height()
            
            # Actualise la fenêtre
            pygame.display.flip()

    # Déplacement du personnage
    nPosX += nDirX
    nPosY += nDirY
    
    # Affiche le fond, puis la personne par-dessus
    fenetre.blit(fond, (0, 0))
    fenetre.blit(perso1, (nPosX, nPosY))

    # Traitement des projectiles, pour les faire bouger.
    for nn in range(nbProj):
        if (afProjVisible[nn]):
            # Un projectile visible, fait-le avancer
            anProjPosY[nn] -= 1

            # Tourne l'image d'origine, pour l'affiche            
            projectile_rot = rot_center(projectile, anProjPosY[nn])
            fenetre.blit(projectile_rot, (anProjPosX[nn], anProjPosY[nn]))

            # Si le projectile a atteint le haut de l'écarn,
            # il est rendu invisible et disponible pour une autre fois
            if (anProjPosY[nn] < -2):
                afProjVisible[nn] = False;

    # Actualise la fenêtre
    pygame.display.flip()

    # Limitation de la vitesse à ... images par seconde
    # 100 => attend que 1000 / 100 [ms] se soit écoulé depuis le dernier appel,
    # avant de continuer.
    # 100 => limite à 100 images par secondes, soit 100 exécutions de la boucle par seconde
    myClock.tick(200) # c.f. https://www.pygame.org/docs/ref/time.html#pygame.time.Clock.tick


pygame.display.quit() # ferme la fenêtre, c.f. https://www.pygame.org/docs/ref/display.html
pygame.quit() # quitte pygame, c.f. https://www.pygame.org/docs/ref/pygame.html


pyg0110a_ping_pong.py   TOP
Déut d'un jeu de ping-pong.
# pyg0110_ping_pong.py
'''
Programmation d'un jeu simple de ping-png, début

C.f. la fin de la page : https://www.pygame.org/docs/tut/PygameIntro.html
Elle donne une liste de modules faisant partie de Pygame.
'''

import pygame
from pygame.locals import *
import os

# Pour positionner la fenêtre Pygame.
os.environ['SDL_VIDEO_WINDOW_POS'] = '%d,%d' % (120, 200)

# Initialisation des modules de Pygame
pygame.init()

# Permet de rendre la fenêtre de taille ajustable.
fenetre = pygame.display.set_mode((640,480), RESIZABLE)

# Une image pour le fond de la fenêtre
fond = pygame.image.load("images/background_herbe.jpg").convert()
perso1 = pygame.image.load("images/perso_1.png").convert_alpha()

# Redimensionne la taille de l'image
# C.f. https://www.pygame.org/docs/ref/transform.html
perso1 = pygame.transform.scale(perso1, (40,40))

# Affiche l'image dans la fenêtre
fenetre.blit(fond, (0, 0))

# Affiche le personnage au-dessus de l'herbe
fenetre.blit(perso1, (200, 200))

# Actualise la fenêtre
pygame.display.flip()

PosX = 200 # Position en X de la perso1
PosY = 210 # Position en Y de la perso1
DirX = 2   # Direction X de déplacement de perso1
DirY = 1.77   # Direction Y de déplacement de perso1

# Pour avoir un autorepeat si une touche est pressée.
pygame.key.set_repeat(10, 3) # répétition de la touche toutes les ... [ms]

# Pour définir une vitesse d'exécution,
# en limitant en attendant qu'un certain temps se soit écoulé avant de continuer.
myClock = pygame.time.Clock()

# Variable qui continue la boucle si = 1, stoppe si = 0
continuer = 1

# ================================================
# Boucle principale
while continuer:

    # Boucle sur tous les événements gérés par Pygame
    for event in pygame.event.get():        
        if event.type == QUIT or event.type == KEYDOWN and event.key == K_ESCAPE:
            # La fenêtre a été fermée ou La touche ESC a été pressée.
            continuer = 0 # Indique de sortir de la boucle.

    # Affiche le fond
    fenetre.blit(fond, (0, 0))

    # Affiche l'image de perso1
    fenetre.blit(perso1, (PosX, PosY))

    # Mouvement automatique de perso1
    PosX = PosX + DirX
    PosY = PosY + DirY

    if (PosX > 600):
        DirX = -DirX
        # Accélère le mouvement de perso1
        DirX -= 0.2

    if (PosX < 10):
        # Rebondi sur la paroi de gauche
        DirX = -DirX
        # Accélère le mouvement de perso1
        DirX += 0.2

            
    if (PosY < 1):
        # Rebondi sur la paroi du haut
        DirY = -DirY
            
    if (PosY > 450):
        # Rebondi sur la paroi du bas
        DirY = -DirY

    # Actualise la fenêtre
    pygame.display.flip()

    # Limitation de la vitesse à ... images par seconde
    # 120 => attend que 1000 / 120 [ms] se soit écoulé depuis le dernier appel,
    # avant de continuer.
    # 120 => limite à 120 images par secondes, soit 20 exécutions de la boucle par seconde
    myClock.tick(120) # c.f. https://www.pygame.org/docs/ref/time.html#pygame.time.Clock.tick

pygame.display.quit() # ferme la fenêtre, c.f. https://www.pygame.org/docs/ref/display.html
pygame.quit() # quitte pygame, c.f. https://www.pygame.org/docs/ref/pygame.html



Plan du Site : Home   arrow   Python   arrow   pygame_code.html ( = http://www.juggling.ch/gisin/python/pygame_code.html )


Page mise à jour le 10 juin 2019 par Bernard Gisin     ( Envoyer un e-mail )
Hébergement par : www.infomaniak.ch