Pygame 7: Le système des coordonnées

Nous avons déjà vu les primitives pour dessiner des rectangles et des cercles. Dans ces articles les deux primitives graphiques étaient utilisées à coté des autres concepts (la génération de numéros aux hasards, la génération de sons etc). Les deux primitives sont:

Mais que sont ces numéros? Si on met dan le coté les couleurs, dans le cercle, la “tuple” (400,300) est le centre du cercle, 50 est le rayon du cercle, 0 est l’épaisseur de la ligne (ici 0 = pas de ligne). Pour le rect, (x, y, taille, taille) est une tuple, équivalent à un objet de type “Rect”, que contient la position du rectangle sur la grille, et sa taille en horizontal et vertical. Mais comment fonctionnent vraiment les coordonnées en Pygame?

La grille d’une surface de Pygame est orienté comme suit, c’est à dire que la position (0, 0) est en haut à gauche:

Si on veut dessiner n’importe quoi, il faut se souvenir de ça. Si, par exemple, nous voulons dessiner une ligne de (1, 1) à (5, 5) on aura besoin d’une appel come celui ci:

Ici épaisseur est 1 parce que 0 n’aurait pas de signification (une ligne d’épaisseur 0 n’existe pas). Dans la grille en haut, si on dessine ça et on assume que la couleur est rouge, voila ce que on obtiendra:

Maintenant on joue un petit peu avec les lignes, les coordonnées et les couleurs. On reprendra l’exemple de l’article 5. Nous restons donc dans le thème des économiseurs d’écran. Nous générerons des lignes aux hasards, qui se suivrons, toujours dans la surface ouverte dans pygame.display.set_mode(). Les touches seront les mêmes, à noter R, B, V, G, E et D. Nous redémarrerons toujours de (0, 0) après une touche “D”.

# Importons la librairie pygame
import pygame

# Importons randint
from random import randint 

# Pour les constantes de pygame 
from pygame.locals import *

# On determine la taille minimle et maximale d'un coté du carré
TAILLE_MIN = 5
TAILLE_MAX = 100

# Les coordonnées du centre varieront entre 600 et 800
X_MAX = 800 
Y_MAX = 600

# Les valeurs RGB varient entre 0 et 255
COUL_MAX = 255

# Si on utilise des rouges, la variable rouges est true
rouges = True
bleues = True
verts  = True

rouge  = 0
vert   = 0
bleue  = 0

# On joue avec les trois couleurs   
trois_couleurs = True 

# On Joue avec une echelle des gris 
gris = False 

# Initialisons la plateforme de jeux 
pygame.init()

# creeons une fenetre de jeux 
gameDisplay = pygame.display.set_mode((800, 600))

# Notre titre pour le jeux...
pygame.display.set_caption("Un Screensaver avec des lignes!")

# Mettons-la à jour (visualizons-la) 
pygame.display.update()

# Condition de sortie 
sortieDuJeux=False 

x1=0
y1=0
# Boucle de gestion des évenements
# La réference pour les evenements est ici: https://www.pygame.org/docs/ref/event.html
while not sortieDuJeux :
    
    # On genere des intiers, aux hazard...
    rouge = randint (0, COUL_MAX) 
    vert  = randint (0, COUL_MAX)
    bleue = randint (0, COUL_MAX)
        
    # Nous generons aussi une taille et un point central aux hazards...
    x2 = randint (0, X_MAX+1)
    y2 = randint (0, Y_MAX+1)
        
    taille = randint(TAILLE_MIN, TAILLE_MAX)


    for event in pygame.event.get():
        
        # On intercepte une touche 
        if event.type == pygame.KEYDOWN:
            # R pour rouges
            if event.key==K_r:
               trois_couleurs = False
               rouges         = True
               bleues         = False
               verts          = False 
               gris           = False
               
            # B pour bleu
            if event.key==K_b:
               trois_couleurs = False
               rouges         = False 
               bleues         = True
               verts          = False 
               gris           = False
               
            # v pour vert
            if event.key==K_v:
               trois_couleurs = False
               rouges         = False
               bleues         = False
               verts          = True 
               gris           = False

            # e pour ensamble: nous varions les trois couleurs! 
            if event.key==K_e:
               trois_couleurs = True
               rouges         = True
               bleues         = True
               verts          = True 
               gris           = False
                
               
            # g pour gris
            if event.key==K_g:
               trois_couleurs = False
               rouges         = True
               bleues         = True
               verts          = True 
               gris           = True               
        
            # d pour Delete!
            if event.key==K_d:
               pygame.draw.rect(gameDisplay, (0,0,0) , (0,0,800,600), 0)
               x1=0
               y1=0
        
        # Manage the "quit" event 
        if event.type == pygame.QUIT :
            sortieDuJeux = True
    
    # On attend un peu... 
    pygame.time.wait(10)
    
    # NOIR! 
    couleur = (0,0,0)
    
    # Les couleurs en Pygame sont des "tuples" de 3 valeurs (rouge, Vert, Bleu). En realité il y a
    # la quatrième composante, la transparence, mais on discuterà de ça plus avant. 
    # On produit notre couleur
    if  not gris :
        couleur = (rouge * rouges, vert * verts, bleue * bleues)
    else :
        couleur = (rouge * rouges, rouge * rouges, rouge * rouges)
        
    # On visualize notre rectangle...  
    # pygame.draw.rect(gameDisplay, couleur, (x,y,taille, taille), 0)
    
    pygame.draw.line(gameDisplay, couleur, (x1, y1), (x2, y2), 1)
    x1 = x2
    y1 = y2
            
    pygame.display.update()
    
# Sortons de Pygame
pygame.quit()

# Sortons du programme
quit()

Et voilà aussi une variation un peu plus élaborée, ou on utilise un petit peu de trigonométrie de base.

# Importons la librairie pygame
import pygame

# importons le maths
import math

# Importons randint
from random import randint


# Pour les constantes de pygame 
from pygame.locals import *

# On determine la taille minimle et maximale d'un coté du carré
TAILLE_MIN = 3
TAILLE_MAX = 200

# Les coordonnées du centre varieront entre 600 et 800
X_MAX = 800 
Y_MAX = 600

# Les valeurs RGB varient entre 0 et 255
COUL_MAX = 255

# Si on utilise des rouges, la variable rouges est true
rouges = True
bleues = True
verts  = True

rouge  = 0
vert   = 0
bleue  = 0

# On joue avec les trois couleurs   
trois_couleurs = True 

# On Joue avec une echelle des gris 
gris = False 

# Initialisons la plateforme de jeux 
pygame.init()

# creeons une fenetre de jeux 
gameDisplay = pygame.display.set_mode((800, 600))

# Notre titre pour le jeux...
pygame.display.set_caption("Un Screensaver avec des lignes!")

# Mettons-la à jour (visualizons-la) 
pygame.display.update()

# Condition de sortie 
sortieDuJeux=False 

x = randint (0, X_MAX+1)
y = randint (0, X_MAX+1)

angle = 0
longeur = randint (TAILLE_MIN, TAILLE_MAX+1)


# Boucle de gestion des évenements
# La réference pour les evenements est ici: https://www.pygame.org/docs/ref/event.html
while not sortieDuJeux :
    
    # On genere des intiers, aux hazard...
    rouge = randint (0, COUL_MAX) 
    vert  = randint (0, COUL_MAX)
    bleue = randint (0, COUL_MAX)
        
    # Nous generons aussi une taille et un point central aux hazards...
    if angle == 360:
        x = randint (0, X_MAX+1)
        y = randint (0, Y_MAX+1)
        longeur = randint (TAILLE_MIN, TAILLE_MAX+1)
        angle = 0 
    else:
        angle = angle + 10
    
    for event in pygame.event.get():
        
        # On intercepte une touche 
        if event.type == pygame.KEYDOWN:
            # R pour rouges
            if event.key==K_r:
               trois_couleurs = False
               rouges         = True
               bleues         = False
               verts          = False 
               gris           = False
               
            # B pour bleu
            if event.key==K_b:
               trois_couleurs = False
               rouges         = False 
               bleues         = True
               verts          = False 
               gris           = False
               
            # v pour vert
            if event.key==K_v:
               trois_couleurs = False
               rouges         = False
               bleues         = False
               verts          = True 
               gris           = False

            # e pour ensamble: nous varions les trois couleurs! 
            if event.key==K_e:
               trois_couleurs = True
               rouges         = True
               bleues         = True
               verts          = True 
               gris           = False
                
               
            # g pour gris
            if event.key==K_g:
               trois_couleurs = False
               rouges         = True
               bleues         = True
               verts          = True 
               gris           = True               
        
            # d pour Delete!
            if event.key==K_d:
               pygame.draw.rect(gameDisplay, (0,0,0) , (0,0,800,600), 0)
               x1=0
               y1=0
        
        # Manage the "quit" event 
        if event.type == pygame.QUIT :
            sortieDuJeux = True
    
    # On attend un peu... 
    pygame.time.wait(5)
    
    # NOIR! 
    couleur = (0,0,0)
    
    # Les couleurs en Pygame sont des "tuples" de 3 valeurs (rouge, Vert, Bleu). En realité il y a
    # la quatrième composante, la transparence, mais on discuterà de ça plus avant. 
    # On produit notre couleur
    if  not gris :
        couleur = (rouge * rouges, vert * verts, bleue * bleues)
    else :
        couleur = (rouge * rouges, rouge * rouges, rouge * rouges)
        
    # On visualize notre rectangle...  
    # pygame.draw.rect(gameDisplay, couleur, (x,y,taille, taille), 0)
    
    x2 = x + math.cos(math.radians(angle)) * longeur 
    y2 = y+ math.sin(math.radians(angle)) * longeur
    
    pygame.draw.line(gameDisplay, couleur, (x, y), (x2, y2), 1)
            
    pygame.display.update()
    
# Sortons de Pygame
pygame.quit()

# Sortons du programme
quit()