## README : Moteur physique rendu graphique avec gestion de la touche up
##
## quand on appuie sur la touche "haut", l'objet saute
## on peut rebondir sur du vide (il faudrait tester le contact pour autoriser le saut)
##
## le comportement de l'objet est le suivant
##      - ax=0 (donc vx est constant)
##      - lorsque l'objet touche le sol il s'arrete selon vy
##      - l'appui d'une touche donne une valeur initiale a vy (saut)
##
## la seule chose qui change est la methode controle dans la classe Jeu
##

# classe qui gere les donnees du jeu
class Jeu():

    # constructeur, initialisation des varaibles
    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
    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=0
            self.y=0
            
        #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()


    # la gestion des touches
    # appelee dans la boucle de jeu
    def controler(self):
        global done

        for event in pygame.event.get():
            #si l'utilisateur arrete
            if event.type == pygame.QUIT:
                done = True
            #gestion de l'appui d'une touche
            if event.type == pygame.KEYDOWN:
                # si c'est la touche "haut"
                if event.key == pygame.K_UP:
                    print("up")
                    jeu.vy=50

    # permet de changer de repere pour l'affichage 
    def changerCoordonnes(self,dx,dy):
        nx = dx
        ny= 400-dy
        return( (nx,ny))


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
    jeu.controler()
                
    # --- 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()
   



