Une fonction pour une trajectoire (TP finalement noté)

On veut commencer un jeu type « angry birds » avec python et pygame.

Pourquoi pas déjà réussir une trajectoire « parabolique » ?

TP noté :
Une note a été donnée, elle pourra évoluer (en mieux ou en moins bien) la semaine prochaine !

On va en fait tracer la courbe d’une fonction point par point.

Étape 1 :

  • Créer une fenêtre de taille 800 par 600
  • La remplir en bleu cyan
  • Tracer un rectangle de 100 pixels d’épaisseur en bas de la fenêtre.
  • Tracer le rectangle « tee » rouge défini ainsi : (95,460,10,40)
  • Tracer le rectangle « trou » noir défini ainsi : (600,500,50,10)
  • Créer les variables
    • x=100
    • y=450
    • rayon=10
  • Placer la balle de rayon rayon sur le « tee »
  • Fini ? Dessiner le nuage avec quatre disques 😀
  • On obtient ce fichier, par exemple :
    import pygame
    
    pygame.init()
    
    fenetre=pygame.display.set_mode((800,600))
    pygame.display.set_caption("Une trajectoire")
    
    # remplir le fond
    fenetre.fill((0,200,200))
    
    # dessiner les rectangles
    pygame.draw.rect(fenetre,(20,128,20),(0,500,800,100),0)
    pygame.draw.rect(fenetre,(255,0,0),(95,460,10,40),0)
    pygame.draw.rect(fenetre,(0,0,0),(600,500,50,10),0)
            
    #nuage
    pygame.draw.circle(fenetre,(255,255,255),(500,100),40,0)
    pygame.draw.circle(fenetre,(255,255,255),(540,110),30,0)
    pygame.draw.circle(fenetre,(255,255,255),(470,105),30,0)
    pygame.draw.circle(fenetre,(255,255,255),(520,70),25,0)
    
    x=100
    y=450
    rayon=10
    
    # dessiner les cercles
    pygame.draw.circle(fenetre,(255,255,255),(x,y),rayon,0)
    
    #mettre à jour l'affichage
    pygame.display.flip()
    
    pygame.time.delay(1500)
    
    pygame.quit()
    

Étape 2 :

Recherche d’une fonction

  • Avec geogebra,
  • avec un tableur
  • En python, on va au début de notre fichier, avant les tracés, définir cette fonction
    def f(x):
        return 0.0056*x**2-3.9709*x+791.005

    et ainsi pouvoir dessiner plusieurs points de la trajectoire dans une boucle :

    for i in range(42) :
        x=x+5 # x devient x plus cinq, 
              # on avance vers la droite
        y=int(f(x)) # y en fonction de x
                    # le int pour avoir un entier
                    # (pour les coordonnées)

Faire bouger un disque ? D’abord finir notre illusion …

On commence par reprendre le TP de la dernière fois.

Correction proposée – animée 😉 :

import pygame

pygame.init()

fenetre=pygame.display.set_mode((820,820))
fenetre.fill((149,184,82))
pygame.display.set_caption("Hello 2GT9 ICN !")

#Dessinons les 49 rectangles
for j in range(7): # 7 lignes j de 0 à 6
    for i in range(7): # 7 carrés de la ligne i de 0 à 6
        pygame.draw.rect(fenetre,(0,0,255),(0+i*120,0+j*120,100,100),0)

        #Il faut basculer l'affichage
        pygame.display.flip()

        #On attend un peu
        pygame.time.delay(50)

#Dessinons les 36 cercles
for j in range(6): # 7 lignes j de 0 à 6
    for i in range(6): # 7 carrés de la ligne i de 0 à 6
        pygame.draw.circle(fenetre,(255,255,255),(110+i*120,110+j*120),14,0)
        
        #Il faut basculer l'affichage
        pygame.display.flip()

        #On attend un peu
        pygame.time.delay(50)


#On attend un peu
pygame.time.delay(5000)

pygame.quit()

Quelques mots ensuite de gestion d’événements. On y reviendra la semaine prochaine.