## README moteur physique avec rendu graphique  (pygame)
##
## la classe Jeu encapsule les grandeurs et les lois physiques
##
## la boucle de jeu pygame
##     - appelle methode evoluer sur le jeu
##     - appelle methode dessiner sur le jeu



class Jeu():

    # initialisation du jeu
    def __init__(self):
        self.x=50
        self.y=50
        self.vx=20
        self.vy=50
        self.ax=0
        self.ay=-9
        self.dt=0.1
        self.trajX=[self.x]
        self.trajY=[self.y]

    # evolution du jeu
    # gere les rebonds
    def evoluer(self):
        self.vx=self.vx+self.ax*self.dt
        self.vy=self.vy+self.ay*self.dt
        self.x=self.x+self.vx*self.dt
        self.y=self.y+self.vy*self.dt

        #rebond sol
        if (self.y<0):
            self.vy=-self.vy
            
        #sortie horizontale de l'ecran 
        if(self.x>600):
            self.vx=-self.vx
        if(self.x<00):
            self.vx=-self.vx
        
        #on peut sauver les points de la trajectoire (si on veut dessiner)
        self.trajX+=[self.x]
        self.trajY+=[self.y]
        

    # affichage textuel
    def afficher(self):
        print("(x,y): "+str(self.x)+","+str(self.y)+"  vx,vy: "+str(self.vx)+","+str(self.vy))


    # affichage graphique avec pygame
    def dessiner(self):
        WHITE = (0xFF, 0xFF, 0xFF)
        RED = (0xFF, 0x00, 0x00)
        BLUE = (0x00, 0x00, 0xFF)
        screen.fill(WHITE)
        # calcul les coordonnées affichage
        coord=self.changerCoordonnes(self.x,self.y)
        # affiche le point
        pygame.draw.rect(screen,RED,(coord[0]-5,coord[1]-5,10,10))

        #on peut afficher la trajectoire stockee dans trajX et trajY
        #pour chaque point de la trajectoire
        for i in range(0,len(self.trajX)-1):
            x=self.trajX[i]
            y=self.trajY[i]
            coord=self.changerCoordonnes(x,y)
            x2=self.trajX[i+1]
            y2=self.trajY[i+1]
            coord2=self.changerCoordonnes(x2,y2)
            #PS : on peut ameliorer la boucle car le x2 et y2 sont les futurs x,y            
            pygame.draw.line(screen,BLUE,coord,coord2,1)
        
        # on inverse les affichages (double buffering)
        pygame.display.flip()


    # permet de changer de repere pour l'affichage 
    def changerCoordonnes(self,dx,dy):
        nx = dx
        ny= 400-dy
        return( (nx,ny))
        
        
        


########################
# boucle de jeu
########################

import pygame
pygame.init()
size = (700, 500)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Moteur")


#on cree un jeu (approche objet)
done = False
jeu=Jeu()

# on creer une horloge pour réguler la vitesse de la boucle de jeu
clock = pygame.time.Clock()

# -------- Boucle principale -----------
# tant que le jeu n'est pas fini
while not done:
    
    # --- on traite les evenements
    for event in pygame.event.get():
        #si l'utilisateur arrete
        if event.type == pygame.QUIT: 
            done = True 
            
    # --- on fait evoluer le jeu
    jeu.evoluer()
    
    # --- on dessine le jeu
    jeu.dessiner()

    # --- on demande d'attendre ce qu'il faut pour un FPS de 60
    clock.tick(60)
# -------- Fin Boucle principale -----------


pygame.quit()
   

