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:
- pygame.draw.circle(surface, couleurs[note], (400, 300), 50, 0)
- pygame.draw.rect(gameDisplay, couleur, (x,y,taille, taille), 0)
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:
- pygame.draw.line(gameDisplay, couleur, (1, 1), (5, 5), 1)
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()