Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL & la trigonométrie

Sujet résolu
    22 février 2018 à 19:23:24

    Bonjour, a tous

    Je viens vous voir, car je voudrais faire déplacer une balles au coordonnées choisis, or je n'arrive pas a faire cela voici mon code en espérant trouver réponse .

    J'ai calculer le module, cos deta et sinus deta comme mon cours sur les nombre complexe me le demande or je ne voit pas comment faire déplacer en fonction de l'angle récuperer enfin les valeur de cos deta et sinus deta et j'ai la distance.

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <math.h>
    #include <SDL/SDL.h>
    
    
    int main(void)
    {
        SDL_Surface* screen = NULL;
        SDL_Event event;
        _Bool closed = false;
    
        SDL_Rect clic = {0, 0, 0, 0};
    
    
        SDL_Surface* ball = NULL;
        SDL_Rect ball_position;
    
    
        float module_z = 0;
        float cos_deta = 0;
        float sin_deta=  0;
    
        if(SDL_Init(SDL_INIT_VIDEO) < 0)
        {
        	fprintf(stderr, "%s\n", SDL_GetError());
        	return EXIT_FAILURE;
        }
    
    
        screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    
        if(screen == NULL)
        {
    		fprintf(stderr, "%s\n", SDL_GetError());
    
        	SDL_Quit();
        	return EXIT_FAILURE;
        }
        SDL_WM_SetCaption("Trigonométrie & Informatique", NULL);
        SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
    
    
        /**********************************************************************/
        ball = SDL_CreateRGBSurface(SDL_HWSURFACE, 15, 15, 32, 0, 0, 0, 0);
        if(ball == NULL)
        {
        	fprintf(stderr, "%s\n", SDL_GetError());
    
        	SDL_FreeSurface(screen);
        	SDL_Quit();
        	return EXIT_FAILURE;
        }
        ball_position.x = 640/2;
        ball_position.y = 480/2;
        SDL_FillRect(ball, NULL, SDL_MapRGB(ball->format, 255, 255, 255));
        SDL_BlitSurface(ball, NULL, screen, &ball_position);
    
    
        while(!closed)
        {
        	SDL_WaitEvent(&event);
        	switch(event.type)
        	{
        		case SDL_QUIT:
        			closed = true;
        			break;
        		case SDL_MOUSEBUTTONDOWN:
        			if(event.button.button == SDL_BUTTON_LEFT)
        			{
        				clic.x = event.button.x;
        				clic.y = event.button.y;
    
        					/* Calcul de la distance entre la ball et le clic */
        				clic.x -= ball_position.x; 
        				clic.y -= ball_position.y;
        				module_z = sqrt((clic.x * clic.x) + (clic.y * clic.y));
    
        					/* Calcul de l'absice et de l'ordonnées 
        						SOH CAH TOA */
        				cos_deta = clic.x / module_z;
        				sin_deta = clic.y / module_z;
    
        				printf("[CLIC] (%d;%d)\n", clic.x, clic.y);
         				printf("|z| = %.6f\n", module_z);
         				printf("cos ϴ : %.6f\n", cos_deta);
         				printf("sin ϴ : %.6f\n", sin_deta);
    
         			}
        			break;
        	}
    
     
     
    
        	SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
    
        	SDL_BlitSurface(ball, NULL, screen, &ball_position);
    
        	SDL_Flip(screen);
        }
        SDL_FreeSurface(ball);
        SDL_FreeSurface(screen);
        SDL_Quit();
        return EXIT_SUCCESS;
    }
    



    • Partager sur Facebook
    • Partager sur Twitter
      22 février 2018 à 19:59:16

      Bonjour,

      Est-ce que la balle doit se déplacer vers l'endroit où l'on clique ?

      Dans ce cas il faut faire une boucle qui tourne toute seule sans attendre d’événement : WaitEvent est bloquant, il faudrait utiliser PollEvent et faire tourner la boucle à période constante.

      Ensuite, à chaque tour de boucle, on ajoute les coordonnées du vecteur vitesse Vx à la position.x et Vy à la position.y tant que la position n'a pas atteinte celle du clic (prévoir une tolérance lors du test).

      Vx et Vy sont à calculer en fonction de la vitesse voulue : Vx est proportionnelle à cos_deta et Vy à sin_deta.

      • Partager sur Facebook
      • Partager sur Twitter
      Architecture SDL                     Multithreading         
        22 février 2018 à 20:10:25

        picosoft a écrit:

        Bonjour,

        Est-ce que la balle doit se déplacer vers l'endroit où l'on clique ?

        Dans ce cas il faut faire une boucle qui tourne toute seule sans attendre d’événement : WaitEvent est bloquant, il faudrait utiliser PollEvent et faire tourner la boucle à période constante.

        Ensuite, à chaque tour de boucle, on ajoute les coordonnées du vecteur vitesse Vx à la position.x et Vy à la position.y tant que la position n'a pas atteinte celle du clic (prévoir une tolérance lors du test).

        Vx et Vy sont à calculer en fonction de la vitesse voulue : Vx est proportionnelle à cos_deta et Vy à sin_deta.


        Merci sa fonctionne j'ai ajouter cos_deta * velocity_x et sa fonctionne a peut prêt correctement . C'est trop satisfaisant . Merci mec !

        • Partager sur Facebook
        • Partager sur Twitter

        SDL & la trigonométrie

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown